【发布时间】:2020-10-24 13:17:44
【问题描述】:
我有一个 一个 行的简单表 (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 子句在第二个用户做某事之前已经找到了该行)。
【问题讨论】:
-
(1) 您的代码不是有效的 SQL Server 代码。 (2) 如果有人开始在他们的查询中使用
NOLOCK之类的东西,那么是的,可能会读取过时的数据。 -
@GordonLinoff 感谢您的评论。假设没有人使用 NOLOCK,我确定不会发生这种情况吗?我的意思是,每个 Update 命令都默认实现 Lock 吗?
-
在 sql server 中是不可能的
-
请运行
DBCC useroptions并发布结果。我们需要查看默认的事务隔离级别 -
@SteveC 感谢您教我这个命令(DBCC 用户选项)。隔离级别已提交读。
标签: sql sql-server sql-update where-clause multi-user