Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL server:并发线程能否更新同一行?_Sql_Sql Server - Fatal编程技术网

SQL server:并发线程能否更新同一行?

SQL server:并发线程能否更新同一行?,sql,sql-server,Sql,Sql Server,我有一个存储的进程,其中包含此更新查询: UPDATE TOP(1) Batch_tbl SET locked = 1 OUTPUT inserted.batchId INTO #batchId FROM Batch_tbl WHERE locked = 0; 它将更新锁定为0的第一行,并将锁定设置为1 如果我有多个线程,有可能有2个以上的线程更新同一行吗?这是假设locked一旦为1,就永远不会设置回0 如果是这样,如何使2+线程始终更新不同的行?否。当SQL Server想要更新行时,将

我有一个存储的进程,其中包含此更新查询:

UPDATE TOP(1) Batch_tbl
SET locked = 1
OUTPUT inserted.batchId INTO #batchId
FROM Batch_tbl 
WHERE locked = 0;
它将更新锁定为0的第一行,并将锁定设置为1

如果我有多个线程,有可能有2个以上的线程更新同一行吗?这是假设locked一旦为1,就永远不会设置回0


如果是这样,如何使2+线程始终更新不同的行?

。当SQL Server想要更新行时,将获取
update
锁。这与其他锁兼容,例如共享锁(读取),但它与另一个更新锁不兼容


因此,如果两个并发用户试图更新同一行,其中一个将“获胜”并获得
更新
锁,而另一个用户/事务将不得不等到第一次更新完成。

您实现自己的锁表/引擎而不是使用MSSQL内置事务行锁的原因是什么?()为什么您认为两个线程可以更新同一行?如果是这样的话,我不相信微软能够销售他们的产品。@Hogan我不知道该怎么想,所以有了这个问题。@Hogan是的,我问这个问题很愚蠢。高兴吗?好的,我的意思是,我并不是故意让人讨厌——我似乎很清楚,更新锁是关系数据库功能的一个基本部分,但可能不是很明显。当然,第二个人必须等待获得更新锁——但最后获得更新锁的人最终将设置行的数据,覆盖以前的值,正确吗?@KyleM:如果没有检查例如
ROWVERSION
列或其他列值-是-最后一个更新数据的过程“成功”,感谢您的回复。我说实现这些保护(如乐观版本控制)是开发人员/ORM工具(如Hibernate)的工作,而不是DBMS的工作,对吗?或者数据库本机提供这种类型的保护?谢谢,我希望这个回答不会太离题。这取决于你使用的ORM。默认情况下,EF使用“比较所有列值”方法,例如,它使用在
UPDATE
语句中读取数据时存储的“旧”列值,如果行在同一时间发生更改,则不会更新任何内容。但是,是的,开发人员的工作是确保这些安全防护