我正在开发一个多线程应用程序(C#),两个线程同时使用NOLOCK更新一个表,这有问题吗?更具体地说,它们都在更新相同的记录。
发布于 2012-01-10 03:25:26
答案是“视情况而定”。
NOLOCK允许“脏读”。这意味着在一个事务中,您可能会看到来自另一个事务的未提交数据。如果有多个线程更新同一表中的同一行,则在另一个线程提交其事务之前,您可能会看到该线程所接触的修改后的数据值。
例如,以表account_balances为例,其定义为(account_num int,balance decimal(12,2))。让我们假设发生了以下情况:
//前提,账号1余额为10.00
<代码>G211
//账户余额现在为- 5,本应为5
您不会看到字段中存在某种形式的不一致数据-- nolock提示不同于在没有锁的情况下运行多线程代码-单独的写操作仍然是原子的。
发布于 2012-01-10 03:15:42
这意味着你可以得到处于“错误”状态的记录。
例如..。
在理想情况下,由Process1删除的所有记录要么存在,要么被删除。因为Process2正在使用NOLOCK,所以它可能会读取Process1正在删除的记录的一些,但不会读取其他记录,因为它们已经消失了。
插入和更新也是如此。您可以简单地读取记录,这些记录只是以某种方式更改的过程中的一部分。
这是否是一个问题取决于您的数据、您的设计等。
搜索引擎不会关心这种情况的发生。一家从事金融交易的银行将。
发布于 2012-01-10 03:48:12
即使使用NOLOCK提示,也不能同时更改相同的记录。
而不是
您可以将数据带入不一致的状态。
AFAIK -无法将此提示应用于更新的目标表。
这个提示允许你重写未提交的数据,而不是覆盖()。
https://stackoverflow.com/questions/8793789
复制相似问题