Oracle 事务隔离机制

事务隔离级别:一个事务对数据库的修改与并行的另一个事务的隔离程度。

 

两个并发事务同时访问数据库表相同的行时,这些问题可以归结为5类:

3类数据读问题(脏读、不可重复读和幻象读)
2类数据更新问题(第一类丢失更新和第二类丢失更新)。

 

 

1、幻想读事务T1读取一条指定where条件的语句,返回结果集。此时事务T2插入一行新记录,恰好满足T1的where条件。然后T1使用相同的条件再次查询,结果集中可以看到T2插入的记录,这条新纪录就是幻想。

2、不可重复读取事务T1读取一行记录,紧接着事务T2修改了T1刚刚读取的记录,然后T1再次查询,发现与第一次读取的记录不同,这称为不可重复读。

3、脏读事务T1更新了一行记录,还未提交所做的修改,这个T2读取了更新后的数据,然后T1执行回滚操作,取消刚才的修改,所以T2所读取的行就无效,也就是脏数据。

4、第一类丢失更新 

A事务撤销时,把已经提交的B事务的更新数据覆盖了。这种错误可能造成很严重的问题,通过下面的账户取款转账就可以看出来: 

 

第二类丢失更新 

A事务覆盖B事务已经提交的数据,造成B事务所做操作丢失

 

Oracle数据库支持READ COMMITTED 和 SERIALIZABLE这两种事务隔离级别。所以Oracle不支持脏读

SQL标准所定义的默认事务隔离级别是SERIALIZABLE,但是Oracle 默认使用的是READ COMMITTED

 

事务隔离机制介绍:

http://blog.csdn.net/gaogaoshan/article/details/21158949

实例测试:

http://www.cnblogs.com/fxb248/archive/2012/01/06/2314696.html

但是,真实情况下并不会出现上文中所说的延迟,这是由于数据库的多版本并发控制MVVC(Multi-Version Concurrency Control).

mvvc的介绍:

http://m.2cto.com/database/201503/381708.html

 

Spring的事务隔离:

spring支持上面说的四种事务隔离机制,还有一个默认的,表示使用数据库默认的隔离机制。

具体可以参考spring相关书籍或者百度。

Spring的事务传播机制:规定了方法是否支持,以及怎么支持事务的。参考书籍或者百度。

下面文章中讲解了其中比较难区分的nested和required_new的区别。

http://m.blog.csdn.net/article/details?id=48185597

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值