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" 被第一个用户找到,但在第一个用户完成余额更改之前?
我的意思是:
- 第一个用户的 Where 子句找到 FirstName = "john" 的行
- 第二个用户进入,将FirstName改为“Dan”。
- 从#1 继续,第一个用户更新了余额,因为第一个用户不知道第二个用户已经更改了一些东西(Where 子句在第二个用户做某事之前已经找到了该行) .
行在修改时被锁定(NOLOCK
不会在更新语句中工作,因此您不必担心)。
所以:
- 第一位用户出现并更新了 John + 10 的余额。
- 第二个用户更新行并将名称更改为 Dan,如果第一个用户尚未提交,第二个用户将等待 +10 余额提交。
- 第一个用户提交
- 第二个用户提交
- 余额为+10,现在名字为Dan。
- 如果第一个用户为 John 触发了另一个语句,那么他们将找不到一行,因此不会更新任何内容。
如果第一个用户在 2 和 3 之间触发相同的更新,那么更新将会成功,因为他们仍然有必要的行锁。
我有一个简单的 table(SQL 服务器),有 一个 行,许多用户可以 访问此行。
如果第一个用户这样做:
Update Table1
Set Balance = Balance +10
Where FirstName= 'John' //The value in this column is "John" indeed.
是否有可能,第一个用户将更新余额,尽管其他用户已输入并将 FirstName 更改为“Dan” FirstName = "John" 被第一个用户找到,但在第一个用户完成余额更改之前?
我的意思是:
- 第一个用户的 Where 子句找到 FirstName = "john" 的行
- 第二个用户进入,将FirstName改为“Dan”。
- 从#1 继续,第一个用户更新了余额,因为第一个用户不知道第二个用户已经更改了一些东西(Where 子句在第二个用户做某事之前已经找到了该行) .
行在修改时被锁定(NOLOCK
不会在更新语句中工作,因此您不必担心)。
所以:
- 第一位用户出现并更新了 John + 10 的余额。
- 第二个用户更新行并将名称更改为 Dan,如果第一个用户尚未提交,第二个用户将等待 +10 余额提交。
- 第一个用户提交
- 第二个用户提交
- 余额为+10,现在名字为Dan。
- 如果第一个用户为 John 触发了另一个语句,那么他们将找不到一行,因此不会更新任何内容。
如果第一个用户在 2 和 3 之间触发相同的更新,那么更新将会成功,因为他们仍然有必要的行锁。