目前,我在存储过程中的所有select语句中的每个表之后都指定了with (nolock)
。
如果我将以下代码添加到存储过程的顶部,我是否仍可以在存储过程中运行更新/插入/删除查询?
set transaction isolation level READ UNCOMMITTED
答案 0 :(得分:2)
是的,但是update/insert/delete won't and can't be "dirty"
无法为插入,更新或删除操作修改的表指定READUNCOMMITTED和NOLOCK。 SQL Server查询优化器忽略应用于UPDATE或DELETE语句的目标表的FROM子句中的READUNCOMMITTED和NOLOCK提示。
接着说这个“功能”无论如何都被弃用了
在SELECT上使用NOLOCK,这意味着既不发出也不发现锁。来自同一个链接
不会发出共享锁以防止其他事务修改当前事务读取的数据,并且其他事务设置的排它锁不会阻止当前事务读取锁定的数据。
所以:
至于在任何地方发行NOLOCK,你知道你为什么这么做吗?我或任何其他高级用户会推荐反对它......
如果您有太多经过验证的阻止读取
,您应该考虑快照隔离(或修复索引/查询)答案 1 :(得分:0)
是的,你可以。隔离级别并不意味着您无法更新/插入/删除。
隔离级别更多关于ACID - 关于被锁定的内容以及其他会话可见的内容。
来自维基百科,Isolation (database systems):
在数据库系统中,隔离是一种属性,用于定义一个操作所做的更改如何/何时对其他并发操作可见。