This answer声称,事务对于多个读取语句也很有用。以下测试用例是否存在错误,还是需要相关表才能返回一致的结果?
在控制台1中执行以下操作:
set transaction isolation level serializable;
begin transaction;
select * from TableA;
waitfor delay '00:00:15';
select * from TableB;
commit transaction;
在控制台#2的15秒窗口中,执行以下操作:
set transaction isolation level serializable;
begin transaction;
insert into TableB(col) values('b');
commit transaction;
经过15秒后,控制台#1返回带有一行'b'
的行。为什么?我认为控制台#1将不会返回任何结果,或者事务#1将中止,因为TableB
已被修改。
我已经在Windows上尝试使用SQL Server LocalDB 2017,在Linux上尝试使用SQL Server 2019 RC1。我使用DataGrip运行了sql命令,但是使用了Entity Framework 6时是原始用例。
答案 0 :(得分:0)
控制台#1的执行针对TableB返回'b'记录,因为控制台#2在控制台#1中的TableB选择查询之前在TableB中添加记录。事务仅锁定执行查询中存在的那些表。 如果在选择TableB之后添加WAIT,则控制台#1将不会获得'b'记录。 如果更改表的结构,如“删除列”并在选择“查询”之前添加“新”列,但如果未使用*,则查询将中止。如果在所选查询中按名称不存在Drop列,则不会产生错误。