NOLOCK与多线程

fbh*_*dev 5 .net sql t-sql sql-server multithreading

我正在研究多线程应用程序(C#),并且2个线程同时使用NOLOCK更新表,这是一个问题吗?更具体地说,他们都在更新相同的记录.

Chr*_*ain 4

答案是“这取决于”。

NOLOCK 允许“脏读”。这意味着在一个事务中,您可能会看到另一个事务中未提交的数据。如果您有多个线程更新同一个表中的同一行,则在该线程提交其事务之前,您可能会看到另一个线程接触的数据的修改值。

例如,以表 account_balances 为例,其定义为 (account_num int, 余额小数(12,2))。我们假设发生以下情况:

// 前提条件,账户 #1 的余额为 10.00

  1. 线程 #1 启动一个事务,将账户 #1 减 10
  2. 线程 #2 启动一个事务,尝试读取帐户 #1 的余额。读取余额为 0。
  3. 线程 #2 将帐户减少 5 美元,并向客户发放透支(他们的余额为 -5)
  4. 线程 #1 回滚其事务
  5. 线程 #2 提交其事务

// 账户余额现在是 -5,尽管它应该是 5。

不会看到字段内某种形式的不一致数据 - nolock 提示不像在没有锁的情况下运行多线程代码 - 各个写入仍然是原子的。