繁体   English   中英

事务可序列化隔离级别

[英]Transaction Serializable Isolation Level

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

ALTER SESSION 设置 ISOLATION_LEVEL = SERIALIZABLE;

问题1

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

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

T2 : 插入 tableName(id, status) 值 (1, 'I');

T2 :提交;

T1 : select * 来自 tableName where status = 'I'; // 为什么T1不能得到T2提交的状态为I 的记录? 这是因为T1创建的快照,这个快照的scope是什么,整个表?

问题2

T1 : 插入 tableName(id, status) 值 (1, 'I');

T2 : 插入 tableName(id, status) 值 (1, 'I'); // 如果 id 是唯一的,则 T2 被阻塞。 为什么T2被挡住了? 因为据我所知,两个事务都会创建一个快照,即使它们还没有提交。

在这种情况下,参与者是否有任何锁? 谢谢。

T1: select * from tableName where status = 'I'; // 为什么T1 不能得到T2 提交的状态为我的记录? 这是因为T1创建的快照,这个快照的scope是什么,整个表?

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

回答你的第二个问题,

T2:插入 tableName(id, status) 值 (1, 'I'); // 如果 id 是唯一的,则 T2 被阻塞。 为什么T2被封锁了? 因为我知道,两个事务都创建了一个快照,他们甚至还没有提交。

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

  1. 这是因为 T1 创建的快照

是的

  1. 这个快照的 scope 是什么,整张桌子?

SCN

问题2:为什么T2被阻塞了?

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

遵循 SERIALIZABLE 的含义:

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

问题 1

所以在 T1 中你不会得到 T2 所做的任何更改,因为你的事务级别是 SERIALIZABLE。 该隔离级别可确保您的查询始终返回相同的结果。 无论查询运行了多长时间,其他事务所做的副作用或更改对查询都是不可见的。

可序列化隔离适用于环境:

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM