浅谈Spring的事务传播特性

谈起事务,最简单就是事务的特性ACID 原子性 一致性 隔离性 持久性。

事务的隔离级别 读未提交 读已提交 可重复读 可串行化

Spring对事务控制的支持统一在TransactionDefinition类中描述,该类有以下几个重要的接口方法: 

  • int getPropagationBehavior():事务的传播行为
  • int getIsolationLevel():事务的隔离级别
  • int getTimeout():事务的过期时间
  • boolean isReadOnly():事务的读写特性

 所谓事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。Spring支持以下7种事务传播行为。 

  • PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务,就加入到这个事务中。这是最常见的选择。
  • PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
  • PROPAGATION_MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常。
  • PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
  • PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  • PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
  • PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

 

谈谈在项目中遇到的困惑

1.比如ClassA中有A方法 B方法  A()--->B()这种情况下 其实不管B用什么事务隔离级别 都不会发生事务的传播特性 因为在同一个service内不会发生 所以不会存在事务传播 只有A()的事务

2.经常会遇到在方法A() 进行try catch 但是没有回滚 原因是没有在catch中把异常抛出去 如下图

这种情况下 事务不会回滚 因为事务基于AOP切面补货的运行时异常的 要想回滚 则应该把异常抛出去 如下图

3.在业务过程中经常需要记录业务日志 但是当异常时需要回滚业务 不需要回滚日志 这个时候 我们需要在另一个service中 写一个记录日志的方法 事务的传播特性是

propagation= Propagation.REQUIRES_NEW  注意需要是不同的service 否则不能发生事务传播特性的

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值