Spring事务(Transaction)的事务传播行为及隔离级别

4 篇文章 0 订阅
1 篇文章 0 订阅

一、事物特性定义

        事物最重要的两个特性,是事物的传播级别和数据隔离级别。传播级别定义的是事物的控制范围,事物隔离界别定义的是事物在数据库读写方面的控制范围。

原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行;

一致性:事务的执行使得数据库从一种正确状态转换成另一种正确状态 ;

隔离性:在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务;

持久性:事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障, 事务的处理结果也会得到保存。

二、七大事务传播行为

1.PROPAGATION_REQUIRED – 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

2.PROPAGATION_SUPPORTS – 支持当前事务,如果当前没有事务,就以非事务方式执行。

3.PROPAGATION_MANDATORY – 支持当前事务,如果当前没有事务,就抛出异常。

4.PROPAGATION_REQUIRES_NEW – 新建事务,如果当前存在事务,把当前事务挂起。

5.PROPAGATION_NOT_SUPPORTED – 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

6.PROPAGATION_NEVER – 以非事务方式执行,如果当前存在事务,则抛出异常。

7.PROPAGATION_NESTED – 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。

三、隔离级别

(1) 读未提交(read Uncommited): 在该隔离级别,所有的事务都可以读取到别的事务中未提交的数据,会产生脏读问题,在项 目中基本不怎么用, 安全性太差;

(2) 读已提交(read commited): 这是大多数数据库默认的隔离级别,但是不是 MySQL 的默认隔离级别;这个隔离级别满足 了简单的隔离要求:一个事务只能看见已经提交事务所做的改变,所以会避免脏读问题; 由于一个事务可以看到别的事务已经提交的数据,于是随之而来产生了不可重复读和虚读等 问题(下面详细介绍这种问题,结合问题来理解隔离级别的含义);

(3) 可重复读(Repeatable read): 这是 MySQL 的默认隔离级别,它确保了一个事务中多个实例在并发读取数据的时候会读取 到一样的数据;不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简 单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当 36 用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB 和 Falcon 存储引擎通 过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

(4) 可串行化(serializable): 事物的最高级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之, 它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争,一 般为了提升程序的吞吐量不会采用这个;

四、什么是嵌套事物?


嵌套事物是子事物套在父事物中执行,子事物是父事物的一部分,在进入子事物之前,父事物建立一个回滚点,叫save point,然后执行子事物,这个子事物的执行也算是父事物的一部分,然后子事物执行结束,父事物继续执行。重点就在于那个save point。以下两个问题点说明:
     
   :如果子事物回滚,会发生什么?
父事物会回滚到进入子事物前建立的save point,然后尝试其他的事物或者其他的业务逻辑,父事物之前的操作不会受到影响,更不会自动回滚。

        :如果父事物回滚,会发生什么?
父事物回滚,子事物也会跟着回滚!因为在父事物结束之前,子事物是不会提交的,子事物是父事物的一部分。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值