他们是两个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子句的锁定吗?
答案 0 :(得分:1)
评论太长了。
您应该阅读SQL Server提供的有关锁定和事务的文档。 Here它是。
在正常情况下,数据库的交易符合ACID标准。在SQL Server中,每个更新语句都是一个事务,因此它可以完成也可以不完成。因此,我希望在正常情况下,SQL Server会将所有值设置为3或全部为4,但不是两者。
然后,事务的语义因现实世界而变得复杂,特别是不同的锁定方案。因此,您可以设置参数以允许例如脏写。这就是为什么我指向你的文档。 ACID-ness有一个基本原则;除此之外,还有很多数据库细节。