在我们的应用程序登录过程中,运行了几个查询,围绕验证登录。在评估它们时,我注意到其中一个查询是在没有 NOLOCK 提示的情况下运行的。
脏读似乎没有任何特别的危险,因为数据几乎不会改变。
考虑到有人一次又一次地尝试登录失败而进行的 DOS 类型攻击,我认为没有 NOLOCK 会降低我们的失败门槛。
我相信这是 DOS 攻击的极不可能的结果(我认为 Web 服务器会先攻击),但添加 NOLOCK 应该使它从不可能变为不可能。
那么,我是过分还是琐碎?
在我们的应用程序登录过程中,运行了几个查询,围绕验证登录。在评估它们时,我注意到其中一个查询是在没有 NOLOCK 提示的情况下运行的。
脏读似乎没有任何特别的危险,因为数据几乎不会改变。
考虑到有人一次又一次地尝试登录失败而进行的 DOS 类型攻击,我认为没有 NOLOCK 会降低我们的失败门槛。
我相信这是 DOS 攻击的极不可能的结果(我认为 Web 服务器会先攻击),但添加 NOLOCK 应该使它从不可能变为不可能。
那么,我是过分还是琐碎?
对于针对您的服务器的 DoS 尝试,您最不必担心是否有 NOLOCK。
我不会出汗的。
如您所说,如果数据很少更改,那么在此处使用 NOLOCK 可能不会造成伤害。
是的,你太过琐碎了。
如果您受到 DOS 攻击,SQL 授权调用上的 NOLOCK 是您最不必担心的。实施一些 DOS 检测、故障跟踪 + 节流,甚至一些不会影响用户但会减慢攻击速度的计划暂停......
这也是一个非常罕见的情况,但仍然:就在有人停用用户以阻止他们登录的那一刻,NOLOCK 让他们进入。可能是需要立即锁定的流氓用户/黑客/员工?
您必须担心这种特殊情况才能放弃 NOLOCK 的性能优势。
如果您经常调用该查询,尤其是在更广泛的事务中,NOLOCK 可能会提高您的性能。
考虑脏读的性质——可能发生这种情况的时间窗口真的很关键吗?例如,您在授权角色中添加或删除某人。
在添加场景中,脏读会在该尝试中失败。(拒绝访问)
在删除场景中,脏读将在该尝试上起作用。(授予访问权限)
如果数据通过手动操作(例如人工交互)发生变化 - 它们的“延迟”余量通常比您的数据库高得多/不确定!
通过查看表的权限,您可以更好地保护您的表。像这样的表不应该允许任何直接访问,所有访问都应该来自存储的过程和对它们设置的权限。