单个事务中的多个读取查询

时间:2019-09-18 20:17:43

标签: sql sql-server transactions isolation-level transaction-isolation

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时是原始用例。

1 个答案:

答案 0 :(得分:0)

控制台#1的执行针对TableB返回'b'记录,因为控制台#2在控制台#1中的TableB选择查询之前在TableB中添加记录。事务仅锁定执行查询中存在的那些表。 如果在选择TableB之后添加WAIT,则控制台#1将不会获得'b'记录。  如果更改表的结构,如“删除列”并在选择“查询”之前添加“新”列,但如果未使用*,则查询将中止。如果在所选查询中按名称不存在Drop列,则不会产生错误。