首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用多线程的NOLOCK

使用多线程的NOLOCK
EN

Stack Overflow用户
提问于 2012-01-10 03:10:57
回答 4查看 428关注 0票数 5

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-10 03:25:26

答案是“视情况而定”。

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

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

//前提,账号1余额为10.00

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

<代码>G211

//账户余额现在为- 5,本应为5

您不会看到字段中存在某种形式的不一致数据-- nolock提示不同于在没有锁的情况下运行多线程代码-单独的写操作仍然是原子的。

票数 4
EN

Stack Overflow用户

发布于 2012-01-10 03:15:42

这意味着你可以得到处于“错误”状态的记录。

例如..。

  • Process1正在删除数据块
  • Process2正在读取重叠的数据块,其中NOLOCK

在理想情况下,由Process1删除的所有记录要么存在,要么被删除。因为Process2正在使用NOLOCK,所以它可能会读取Process1正在删除的记录的一些,但不会读取其他记录,因为它们已经消失了。

插入和更新也是如此。您可以简单地读取记录,这些记录只是以某种方式更改的过程中的一部分。

这是否是一个问题取决于您的数据、您的设计等。

搜索引擎不会关心这种情况的发生。一家从事金融交易的银行将。

票数 2
EN

Stack Overflow用户

发布于 2012-01-10 03:48:12

即使使用NOLOCK提示,也不能同时更改相同的记录。

而不是

您可以将数据带入不一致的状态。

AFAIK -无法将此提示应用于更新的目标表。

这个提示允许你重写未提交的数据,而不是覆盖()。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8793789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档