问题描述
我有一个简单的表(SQL Server),其中有一个行,许多用户可以 访问该行。
如果第一个用户这样做:
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子句在第二位用户执行某项操作之前已经找到该行)。 / li>
解决方法
修改行时它们被锁定了(NOLOCK
在更新语句中不起作用,因此您不必为此担心)。
所以:
- 第一个用户出现并更新John + 10的余额。
- 第二个用户更新该行并将名称更改为Dan,如果第一个用户尚未提交,第二个用户将等待直到+10余额已提交。
- 第一个用户提交
- 第二个用户提交
- 余额是+10,现在的名字是Dan。
- 如果第一个用户为John触发了另一条语句,那么他们将找不到行,因此没有任何更新。
如果第一个用户在2和3之间触发了相同的更新,则更新将成功,因为他们仍然具有必要的行锁。