spring 事务注解形式@Transactional

使用@Transactional的事务注解时,默认的传播属性为:PROPAGATION_REQUIRED,整个service服务调用过程中,都使用一个共享的事务,当有任何异常发生的时候,所有操作回滚。
如下:
1.方法需要调用封发服务中的事务方法batchDispatch
bag = trimlyGridDispatchService.batchDispatch(trimlyGridDispatchQuery);

2.事务方法batchDispatch 其中调用了另外一个事务方法batchCreate
@Transactional
public IntDomDispBag batchDispatch(TrimlyGridDispatchQuery query) throws Exception {
//1 批量校验邮件、生成邮件
TrimlyGridDispatchQuery batchCreate = exportDomDispItemService.batchCreate(query);

return callSealBagMeth;
}

3.事务方法batchCreate
@Transactional
public TrimlyGridDispatchQuery batchCreate(TrimlyGridDispatchQuery query) throws Exception {
IntDomUnpItemDTO intDomUnpItemDTO = null;

}

1.执行batchDispatch时会自动开启一个事务,而由batchDispatch调用batchCreate时,由于事务已经存在,因此会使用已经存在的事务;
2.如果batchDispatch或者batchCreate发生异常,事务都会回滚。

如果需要其他的事务传播属性,可以使用如:
@Transactional(propagation=propagation.REQUIRED)
@Transactional(propagation=propagation.MANDATORY)
@Transactional(propagation=propagation.NESTED)
@Transactional(propagation=propagation.REQUIRES_NEW)
@Transactional(propagation=propagation.NOT_SUPPORTED)
@Transactional(propagation=propagation.SUPPORTED)
各传播方式的解析见备注。
事务传播属性
示例代码:
Class A {
@Transactional(propagation=propagation.REQUIRED)
public void aMethod {
B b = new B();
b.bMethod();
}
}

Class B {
@Transactional(propagation=propagation.REQUIRED)
public void bMethod { //something }
}

REQUIRED:支持当前已经存在的事务,如果还没有事务,就创建一个新事务。假设调用aMethod前不存在任何事
务,那么执行aMethod时会自动开启一个事务,而由aMethod调用bMethod时,由于事务已经存在,因
此会使用已经存在的事务(也就是执行aMethod之前创建的那个事务)。
   对于这样的配置,如果bMethod过程中发生异常需要回滚,那么aMethod中所进行的所有数据库操作也
将同时被回滚,因为这两个方法使用了同一个事务。

MANDATORY的:支持当前已经存在的事务,如果还没有事务,就抛出一个异常。如果上例中aMethod的传播性配置
为MANDATORY,我们就无法在没有事务的情况下调用aMethod,因此,传播性为MANDATORY的方法必定是
一个其他事务的子事务,当逻辑上独立存在没有意义或者可能违反数据、事务完整性的时候,就可
以考虑设置这样的传播性设置。

NESTED:在当前事务中创建一个嵌套事务,如果还没有事务,那么就简单地创建一个新事务。
REQUIRES_NEW:挂起当前事务,创建一个新事务,如果还没有事务,就简单地创建一个新事务。
  注意以上两者的区别,两种传播性行为是类似的,在事务回滚时,两者有很大的区别。
首先,REQUIRES_NEW会创建一个与原事务无关的新事务,尽管是由一个事务调用了另一个事务,但却没
有父子关系。
   如果bMethod的传播性是REQUIRES_NEW,而抛出了一个异常,则bMethod一定会被回滚,而如果aMethod
捕获并处理了这个bMethod抛出的异常,那么aMethod仍有可能成功提交。当然,如果aMethod没有处理这个
异常,那么aMethod也会被回滚。
   如果aMethod在bMethod完成后出现了异常,那么bMethod已经提交而无法回滚,只有aMethod被回滚了。
  
对于NESTED,虽然也会创建一个新事务,但是这个事务与调用者是有父子关系的相互依存的。
  如果bMethod的传播性是NESTED,抛出了一个异常,事务的回滚行为与REQUIRES_NEW是一致的。
  如果aMethod在bMethod完成后出现了异常,bMethod同样也会被回滚。

NEVER的:强制要求不在事务中运行,如果当前存在一个事务,则抛出异常。
NOT_SUPPORTED:强制不在事务中运行,如果当前存在一个事务,则挂起该事务。
SUPPORTS:支持当前事务,如果没有事务那么就不在事务中运行。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值