在READ UNCOMMITTED隔离级别中,我可以针对我的SQL db运行更新查询吗?

时间:2011-09-29 18:38:09

标签: sql-server

目前,我在存储过程中的所有select语句中的每个表之后都指定了with (nolock)

如果我将以下代码添加到存储过程的顶部,我是否仍可以在存储过程中运行更新/插入/删除查询?

set transaction isolation level READ UNCOMMITTED

2 个答案:

答案 0 :(得分:2)

是的,但是update/insert/delete won't and can't be "dirty"

  

无法为插入,更新或删除操作修改的表指定READUNCOMMITTED和NOLOCK。 SQL Server查询优化器忽略应用于UPDATE或DELETE语句的目标表的FROM子句中的READUNCOMMITTED和NOLOCK提示。

接着说这个“功能”无论如何都被弃用了

在SELECT上使用NOLOCK,这意味着既不发出也不发现锁。来自同一个链接

  

不会发出共享锁以防止其他事务修改当前事务读取的数据,并且其他事务设置的排它锁不会阻止当前事务读取锁定的数据。

所以:

  • 您自己的SELECT不会发出共享锁
  • 你忽略了其他锁(例如脏读)

至于在任何地方发行NOLOCK,你知道你为什么这么做吗?我或任何其他高级用户会推荐反对它......

如果您有太多经过验证的阻止读取

,您应该考虑快照隔离(或修复索引/查询)

答案 1 :(得分:0)

是的,你可以。隔离级别并不意味着您无法更新/插入/删除。

隔离级别更多关于ACID - 关于被锁定的内容以及其他会话可见的内容。

来自维基百科,Isolation (database systems)

  

在数据库系统中,隔离是一种属性,用于定义一个操作所做的更改如何/何时对其他并发操作可见。