[英]Multiple read queries in a single transaction
这个答案声称事务对于多个读取语句也很有用。 下面的测试用例是错误的还是需要相关的表才能返回一致的结果?
在控制台 #1 中执行以下命令:
set transaction isolation level serializable;
begin transaction;
select * from TableA;
waitfor delay '00:00:15';
select * from TableB;
commit transaction;
在控制台 #2 中,在那 15 秒 window 中,执行以下操作:
set transaction isolation level serializable;
begin transaction;
insert into TableB(col) values('b');
commit transaction;
15 秒后,控制台 #1 返回一行,其中包含'b'
。 为什么? 我认为控制台 #1 不会返回任何结果,或者事务 #1 会中止,因为TableB
已被修改。
I've tried SQL Server LocalDB 2017 on Windows and SQL Server 2019 RC1 on Linux. 我使用 DataGrip 运行了我的 sql 命令,但我使用 Entity Framework 6 的原始用例。
控制台#1 执行返回针对TableB 的'b' 记录,因为控制台#2 在控制台#1 中TableB 的选择查询之前添加了TableB 中的记录。 事务仅锁定已执行查询中存在的那些表。 如果在选择 TableB 后等待添加,则控制台 #1 将不会获得“b”记录。 如果表的结构发生更改,例如删除列并在选择查询之前添加新列,但如果未使用 *,则查询将被中止。 如果在所选查询中按名称不存在 Drop 列,则不会生成错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.