Spring中事务传播

首先要有前导知识,知道单个事务的情况下程序提交还是回滚是取决于是否有异常,有异常则回滚,无异常则提交。
在没有使用Spring的时候,在服务之间调用的时候,只要我们在操作数据库的时候使用的是同一个连接,则就能保证是同一个事务。所以只要把Connection作为参数传递给下一个服务即可。
但是使用Spring以后,所有的服务(Spring中的Bean元素)和事务都是交由Spring管理,所以按之前的操作仍是可以处理事务,但是Spring为提供了两种事务管理方式,更应该使用Spring提供的事务管理方式。而Spring中的事务管理分为声明式事务和编程式事务。

说到事务的传播,必定是在两个及其以上才成为传播,而我们说的传播则是在两个事务之间的传播,咬文嚼字的可以说,传播者和被传播者。即使有多个事务,从内向外两两依次处理,此处我们称外层事务和内层事务。

1REQUIRED:Support a current transaction, create a new one if none exists.Analogous to EJB transaction attribute of the same name.This is the default setting of a transaction annotation.(有则执行当前事务,无则新建新事务)

2SUPPORTS:Support a current transaction, execute non-transactionally if none exists.Analogous to EJB transaction attribute of the same name.(有则执行当前事务,无则不执行)

3MANDATORY:Support a current transaction, throw an exception if none exists.(有则执行当前事务,无则抛异常)

4REQUIRES_NEW:Create a new transaction, and suspend the current transaction if one exists.Analogous to the EJB transaction attribute of the same name.(存在事务则挂起当前事务,并且新建新事务)

5NOT_SUPPORTED:Execute non-transactionally, suspend the current transaction if one exists.

6NEVER:Execute non-transactionally, throw an exception if a transaction exists.Analogous to EJB transaction attribute of the same name.

7NESTED:Execute within a nested transaction if a current transaction exists,behave like REQUIRED otherwise. There is no analogous feature in EJB.

1》如果内部方法是支持当前事务的话,说明外部事务和内部事务是同一个,有异常外部事务和内部事务都会回滚;无异常则提交。

2》外部事务调用内部事务,而内部事务会新建一个事务并且将外部事务挂起的话:
2.1》如果内部新建事务中出现异常并且抛出给外部事务的话,外部事务捕获处理即外部事务未产生异常,则不影响外部事务,所以外部事务以及相关的内部事务不需要回滚;
2.2》如果内部新建事务中出现异常并且抛出给外部事务的话,外部事务没有捕获未处理即外部事务出现异常,则影响外部事务,外部事务以及相关的内部事务都会回滚;

3》外部事务调用内部事务,而内部事务会嵌套一个新的事务并且将外部事务挂起:
3.1》如果外部事务出现异常的话,则会影响内部事务,将内部事务回滚。
3.2》如果内部事务出现异常的话,外部事务捕获异常处理异常,则不影响外部事务;
3.3》如果内部事务出现异常的话,外部事务没有捕获异常即未处理异常,则影响外部事务;

Spring事务传播是指在多个事务方法相互调用时,如何处理这些事务传播Spring定义了7种不同的事务传播行为,分别是: 1. REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是默认的传播行为。 2. SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式继续执行。 3. MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。 4. REQUIRES_NEW:创建一个新的事务,并且暂停当前事务(如果存在)。 5. NOT_SUPPORTED:以非事务方式执行,如果当前存在事务,则把当前事务挂起。 6. NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。 7. NESTED:如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则创建一个新的事务。 举个例子,假设有两个方法A和B,A方法开启了一个事务,B方法也需要开启一个事务,那么这时候就需要考虑事务传播行为了。如果B方法的传播行为是REQUIRED,那么B方法会加入A方法的事务,如果B方法的传播行为是REQUIRES_NEW,那么B方法会开启一个新的事务,与A方法的事务无关。 另外,如果在事务方法捕获了异常,需要手动回滚事务,可以使用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()方法来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值