.net - NOLOCK 与多线程

标签 .net sql sql-server multithreading tsql

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

最佳答案

答案是“视情况而定”。

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

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

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

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

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

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

关于.net - NOLOCK 与多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8793789/

相关文章:

sql - 使用两列对查询结果进行排序

php - 在表中添加两个属性,然后使用 AS

PHP/MySQL - 选择各种表,有一些行名

sql - 如何在 SQL 中添加时间?

sql - 在 select 语句中多次调用标量函数是否会多次运行该函数,如果是这样,如何解决这个问题

c# - Task.Delay() 挂起几分钟

.net - 在 NCalc 中为什么 'if (12 > 8)' 解析为 false?

.net - 如何使用 .NET 执行多个 Oracle SQL 语句

sql-server - 如何创建多表检查约束?

c# - 如何将泛型 List<T> 转换为基于接口(interface)的 List<T>