SQLServer如何根据查询WHERE子句锁定行

时间:2014-06-03 23:12:21

标签: sql sql-server

他们是两个sql会话

会话1首先开始

update table1
set status = 3
where status = 2

会话2开始第二,但会话1继续运行

update table1
set status = 4
where status = 2

第1和第2阶段结束

是否可能,一个记录将是状态3而另一个状态是4?或者总是更新记录将是状态3? Sql引擎首先锁定所有传递where子句的行,而另一个语句必须获取锁定,否则当读取时记录被锁定? 换句话说,在where子句上设置锁定,另一个语句必须获取对这个where子句的锁定吗?

1 个答案:

答案 0 :(得分:1)

评论太长了。

您应该阅读SQL Server提供的有关锁定和事务的文档。 Here它是。

在正常情况下,数据库的交易符合ACID标准。在SQL Server中,每个更新语句都是一个事务,因此它可以完成也可以不完成。因此,我希望在正常情况下,SQL Server会将所有值设置为3或全部为4,但不是两者。

然后,事务的语义因现实世​​界而变得复杂,特别是不同的锁定方案。因此,您可以设置参数以允许例如脏写。这就是为什么我指向你的文档。 ACID-ness有一个基本原则;除此之外,还有很多数据库细节。