SQL的where子句-可以读取旧数据吗?

问题描述

我有一个简单的表(SQL Server),其中有一个行,许多用户可以 访问该行。

如果第一个用户这样做:

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子句在第二位用户执行某项操作之前已经找到该行)。 / li>

解决方法

修改行时它们被锁定了(NOLOCK在更新语句中不起作用,因此您不必为此担心)。

所以:

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

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...