如何解决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”是第一个用户找到的,但是在更改余额之前是第一个用户完成的吗?
我的意思是:
- 第一个用户的Where子句找到FirstName =“ john”的行
- 输入了第二个用户,并将FirstName更改为“ Dan”。
- 从#1继续,余额由第一位用户更新,因为第一位用户不知道第二位用户已更改了某些内容(Where子句在第二位用户执行某项操作之前已经找到该行)。 / li>
解决方法
修改行时它们被锁定了(NOLOCK
在更新语句中不起作用,因此您不必为此担心)。
所以:
- 第一个用户出现并更新John + 10的余额。
- 第二个用户更新该行并将名称更改为Dan,如果第一个用户尚未提交,第二个用户将等待直到+10余额已提交。
- 第一个用户提交
- 第二个用户提交
- 余额是+10,现在的名字是Dan。
- 如果第一个用户为John触发了另一条语句,那么他们将找不到行,因此没有任何更新。
如果第一个用户在2和3之间触发了相同的更新,则更新将成功,因为他们仍然具有必要的行锁。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。