我正在开发一个多线程应用程序 (C#),并且 2 个线程同时使用 NOLOCK 更新表,这是一个问题吗?更具体地说,它们都更新相同的记录。
最佳答案
答案是“视情况而定”。
NOLOCK 允许“脏读”。这意味着在一个事务中,您可能会看到来自另一个事务的未提交数据。如果您有多个线程更新同一个表中的同一行,则在该线程提交其事务之前,您可能会看到另一个线程接触的数据的修改值。
例如,以表 account_balances 为例,其定义为 (account_num int, 余额小数(12,2))。让我们假设发生以下情况:
//前提条件,账户 #1 的余额为 10.00
- 线程 #1 启动事务,将账户 #1 减少 10
- 线程 #2 启动事务,尝试读取帐户 #1 的余额。读取余额为 0。
- 线程 #2 将帐户减少 5 美元,并向客户 overdraw (其余额为 -5)
- 线程 #1 回滚其事务
- 线程 #2 提交其事务
//帐户余额现在为 -5,尽管它应该是 5。
您不会看到字段内某种形式的不一致数据 - nolock 提示不像在没有锁的情况下运行多线程代码 - 各个写入仍然是原子的。
关于.net - NOLOCK 与多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8793789/