事务可序列化隔离级别

Transaction Serializable Isolation Level

Oracle 数据库 11g 企业版 11.2.0.4.0 版 - 64 位生产

更改会话集ISOLATION_LEVEL = 可序列化;

问题1:

T1(事务 1)和 T2(事务 2)

T1: select * 来自 tableName where status = 'A';

T2: insert into tableName(id, status) values (1, 'I');

T2:提交;

T1: select * 来自 tableName where status = 'I'; // 为什么T1获取不到我在T2提交的status记录?这是因为 T1 创建的快照吗?这个快照的范围是什么,整个 table?

问题2:

T1: insert into tableName(id, status) values (1, 'I');

T2: insert into tableName(id, status) values (1, 'I'); // 如果 id 是唯一的,则 T2 被阻止。为什么T2被封锁?因为据我所知,两个事务都会创建一个快照,即使它们还没有提交。

在这个场景中是否有任何锁带参与者? 谢谢。

T1: select * from tableName where status = 'I'; // Why T1 can not get the record with status I committed by T2? Is this because the snapshot created by T1 and what's the scope of this snapshot, the whole table?

因为 SERIALIZE 事务可以看到事务开始之前提交的数据或者事务本身所做的任何更改。这就是 T1 无法看到在 T1 事务启动后插入的记录 I 的原因。

回答你的第二个问题,

T2: insert into tableName(id, status) values (1, 'I'); // T2 is blocked if id is unique. Why T2 blokced? Becase as I known, both transaction create an snapshot and they even have not commit yet.

即使两个事务都是 SERIALIZE,Oracle 保持完整性并且不允许违反任何约束。因此,您不能在违反任何约束的 T2 交易中添加记录 I。

  1. Is this because the snapshot created by T1

  1. and what's the scope of this snapshot, the whole table?

SCN

Question2: Why T2 blokced?

因为您有唯一键或主键约束并且没有延迟。

遵循 SERIALIZABLE 的含义:

可序列化。这通常被认为是限制性最强的事务隔离级别,但它提供了最高程度的隔离。 SERIALIZABLE 事务在这样的环境中运行,使其看起来好像没有其他用户在修改数据库中的数据。您读取的任何行在重新读取时都保证是相同的,并且任何您执行的查询保证 return 在事务的生命周期内得到相同的结果。

问题 1

所以在 T1 中你不会得到 T2 所做的任何更改,因为你的事务级别是 SERIALIZABLE。该隔离级别确保您的查询始终 return 相同的结果。无论查询多长时间 运行.

,查询都看不到其他事务所做的副作用或更改

可序列化隔离适用环境:

  • 大型数据库和仅更新少数几个的短事务 行
  • 两个并发事务修改的机会 同排比较少
  • 相对较长的运行事务主要是只读的

关于你的第二个问题,执行提交后该行将被锁定,但该行对于 T2 将不可见。

这里有更多信息和一个很好的例子:

https://docs.oracle.com/cd/E25054_01/server.1111/e25789/consist.htm#BABCJIDI

第 9.3 节可序列化事务中的读取一致性和序列化访问问题