WITH(NOLOCK)的最佳选择?

时间:2015-10-05 14:07:10

标签: .net sql-server transactions nolock

我在C#.Net中创建一个自我项目,通过使用3层应用程序,我不想使我的sql语句具有事务性,这些语句用于几个存储过程,I&#39 ;我一直在使用WITH(NOLOCK)方法来查询在事务期间用于插入或更新的那些表,而在C#方面我一直在使用TransactionScope,但我最近使用WITH读取了(建议不要使用NOLOCK,因为它可能会导致幻像读取或使用脏的和不一致的数据。我的问题是,为了使用在事务期间插入或更新的数据,当涉及到选择时,在事务操作方面最好的方法是什么?,无论是数据库端还是业务代码端。

3 个答案:

答案 0 :(得分:2)

您是否考虑过快照隔离?它提供了完美的读取一致性,并且根本不会锁定数据。

SI是许多RDBMS的标准配置,默认为。不确定为什么SQL Server人员对使用它如此犹豫不决。缺点是温和的,但你需要研究它们。

答案 1 :(得分:1)

你根本就不需要它。如果您修改某些数据并稍后在同一事务中查询它,您将获得修改后的数据。

您的交易将对修改后的数据进行独占锁定,因此它可以对其执行任何操作 - 查询,再次修改等。

如果指定WITH(NOLOCK),则允许查询忽略OTHER事务的独占锁。这将导致您的查询返回不正确的数据。

答案 2 :(得分:1)

也许你不知道自己想要什么。

WITH(NOLOCK)返回脏的和不一致的数据。

如果您想要干净的数据,则必须删除此子句,并等待要读取的表上的最终并发更新。