Sql 的 Where 子句 - 它可以读取陈旧数据吗?

Where clause of Sql - may it read a stale data?

我有一个简单的 table(SQL 服务器),有 一个 行,许多用户可以 访问此行。

如果第一个用户这样做:

Update Table1 
Set Balance = Balance +10
Where FirstName= 'John' //The value in this column is "John" indeed.

是否有可能,第一个用户将更新余额,尽管其他用户已输入并将 FirstName 更改为“Dan” FirstName = "John" 被第一个用户找到,但在第一个用户完成余额更改之前?

我的意思是:

  1. 第一个用户的 Where 子句找到 FirstName = "john" 的行
  2. 第二个用户进入,将FirstName改为“Dan”。
  3. 从#1 继续,第一个用户更新了余额,因为第一个用户不知道第二个用户已经更改了一些东西(Where 子句在第二个用户做某事之前已经找到了该行) .

行在修改时被锁定(NOLOCK 不会在更新语句中工作,因此您不必担心)。

所以:

  1. 第一位用户出现并更新了 John + 10 的余额。
  2. 第二个用户更新行并将名称更改为 Dan,如果第一个用户尚未提交,第二个用户将等待 +10 余额提交。
  3. 第一个用户提交
  4. 第二个用户提交
  5. 余额为+10,现在名字为Dan。
  6. 如果第一个用户为 John 触发了另一个语句,那么他们将找不到一行,因此不会更新任何内容。

如果第一个用户在 2 和 3 之间触发相同的更新,那么更新将会成功,因为他们仍然有必要的行锁。