ORA-08177: cant serialize access for this transaction问题研究

1、创建测试表


 

2、开第一个会话,将事务隔离级别设置为“SERIALIZABLE”,在没有其它事务操作时的情况正常。最后修改一条记录,但不提交。

 

3、建立第二个会话,设置事务隔离级别,修改第一个事务修改的记录,同样不提交,其现象是等待。

 

4、此时,提交第一个事务。

 

5、第二个事务报错

 

6、将事务隔离级别改为“READ COMMITTED”的情况

第一个事务:

第二个事务

第一个事务提交

 

第二个事务没有报错

 

--------------------------------------------------------------

Oracle的隔离级别

Oracle提供了SQ92标准中的read committed和SERIALIZABLE,同时提供了非SQ92标准的read-ony。

read committed:

· 这是ORACE缺省的事务隔离级别。

· 事务中的每一条语句都遵从语句级的读一致性。

· 保证不会脏读;但可能出现非重复读和幻像。

SERIALIZABLE:(串行执行事务,并发性最小)

· 简单地说,SERIALIZABLE就是使事务看起来象是一个接着一个地顺序地执行。

· 仅仅能看见在本事务开始前由其它事务提交的更改和在本事务中所做的更改。

· 保证不会出现非重复读和幻像。

· SERIALIZABLE隔离级别提供了read-ony事务所提供的读一致性(事务级的读一致性),同时又允许DM操作。

如果有在SERIALIZABLE事务开始时未提交的事务在SERIALIZABLE事务结束之前修改了SERIALIZABLE事务将要修改的行并进行了提交,则SERIALIZABLE事务不会读到这些变更,因此发生无法序列化访问的错误。

 

 


请使用浏览器的分享功能分享到微信等