这个答案声称一个事务对于多个读取语句也是有用的。 以下测试用例是否存在错误,或者是否需要相关表才能返回一致的结果?

在控制台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

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

  ask by Jani translate from so

未解决问题?本站智能推荐:

1回复

如何设置隔离级别,以便一个事务完成后,插入的数据可用于另一事务?

我有下表(大大简化了): 为理念JobsData的是,在任何项目Data可以关联到一个或多个项目Jobs ,并在每个项目Jobs可以由一个或多个项目Data与它相关联。 现在我有两笔交易: 带有锁定提示的代码来自此答案 。 其目的是让多个TRAN2实例并行运行,并且永远不
1回复

我如何实现一个事务不允许读取另一行读取的行的情况?

如何实现一个事务读取的行不允许另一事务读取的情况? 从我的带有columnA-F的表之一中,我需要选择max(columnA) 。 使用最大值并基于一些计算,我将不得不执行其他插入语句。 使用可序列化的隔离级别,有2个事务读取相同的最大值。 这导致等待一个事务的锁等待,而另一个事
1回复

等待对某行进行锁定时读取它—事务隔离

我想锁定一个表行,以便对该行的任何其他读取操作都将等到释放该锁为止,并且我想避免对整个表进行锁定。 我有下表(InnoDB) 我执行以下事务以获得对行的锁定 我希望以下查询等待锁被释放 为此,我发现的唯一方法是按以下方式运行SELECT 它将等待释放锁,但是
1回复

在Django中,如何实现事务的可重复读取?

我有一个函数,它在同一个数据集上执行多个查询,我想确保所有查询都能看到完全相同的数据。 就SQL而言,这意味着支持它的数据库的REPEATABLE READ隔离级别。 如果数据库不具备,我不介意更高级别甚至完全锁定。 据我所知,情况并非如此。 即如果我在一个Python shel
1回复

SQL内部查询在两个事务之间选择

需要帮助了解内部查询选择两个事务之间的读取 每次执行查询时,我都会更新SER_NUM = SER_NUM + 1,因此请求如此之大,以至于每秒可能有数千个请求。 问题是两个查询事务能否有机会从内部选择中读取相同的值,而两个事务更新相同的值? 有没有一种简单的方法可以使Tran
1回复

MySql:用于增加数字的正确事务隔离级别

假设数据库中有一个这样的表: 假设有多个客户端写入该表。 对于“代码”一栏,我们要确保它遵循模式的严格 “今年年- 第n”。 所有客户端应使用的正确事务隔离级别是什么? ----更新---- 2018-09-11 11:31:24 --------- 对上述交易
1回复

为原子“获取或创建”方案选择哪种事务隔离级别

哪种事务隔离级别最能保证仅创建1个数据行。 假设使用SQL Server 2012和EntityFramework 6。
1回复

MySQL中具有REPEATABLE READ隔离级别的更新插入

我有一个要在MYSQL中执行更新插入的步骤(我必须使用REPEATABLE-READ隔离级别)。场景是- 现在,NAME = NAME1的每个新条目都应使用STATUS = INACTIVE更新旧条目,然后应插入新条目,即 如果两个事务要插入新条目(一个AMOUNT = 800,