假设我们使用create new table并为我们的数据库启用快照隔离:
alter database database_name set allow_snapshot_isolation on
create table marbles (id int primary key, color char(5))
insert marbles values(1, 'Black') insert marbles values(2, 'White')
Run Code Online (Sandbox Code Playgroud)
接下来,在会话1中开始一个快照事务:
set transaction isolation level snapshot
begin tran
update marbles set color = 'Blue' where id = 2
Run Code Online (Sandbox Code Playgroud)
现在,在提交更改之前,在会话2中运行以下命令:
set transaction isolation level snapshot
begin tran
update marbles set color = 'Yellow' where id = 2
Run Code Online (Sandbox Code Playgroud)
然后,当我们提交会话1时,会话2将失败,并显示有关事务中止的错误 - 我知道这可以防止更新丢失.
如果我们逐个执行此步骤但具有任何其他隔离级别,例如:可序列化,可重复读取,读取提交或未提交读取,则会执行此会话2,从而对表进行新的更新.有人可以解释一下我为什么会这样吗?对我来说,这是一种丢失的更新,但似乎只有快照隔离才能阻止它.
t-sql sql-server transactions transaction-isolation isolation-level