`

spring @Transactional 理解与问题分析

阅读更多

事物传播行为介绍:

  @Transactional(propagation=Propagation.REQUIRED) :如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)
  @Transactional(propagation=Propagation.NOT_SUPPORTED) :容器不为这个方法开启事务
  @Transactional(propagation=Propagation.REQUIRES_NEW) :不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
  @Transactional(propagation=Propagation.MANDATORY) :必须在一个已有的事务中执行,否则抛出异常
  @Transactional(propagation=Propagation.NEVER) :必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)
  @Transactional(propagation=Propagation.SUPPORTS) :如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务.

事物超时设置:
  @Transactional(timeout=30) //默认是30秒


事务隔离级别:
  @Transactional(isolation = Isolation.READ_UNCOMMITTED):读取未提交数据(会出现脏读, 不可重复读) 基本不使用
  @Transactional(isolation = Isolation.READ_COMMITTED):读取已提交数据(会出现不可重复读和幻读)
  @Transactional(isolation = Isolation.REPEATABLE_READ):可重复读(会出现幻读)
  @Transactional(isolation = Isolation.SERIALIZABLE):串行化

  MYSQL: 默认为REPEATABLE_READ级别
  SQLSERVER: 默认为READ_COMMITTED


Transactional propagation默认传播行为值是
1.默认require:当有新的事务部开启,加入之前事务。
https://blog.csdn.net/kiwi_coder/article/details/20214939
1.1 @Transactional A, @Transactional B,如果A调用B,B抛异常throw,B会记录rollback,A正常接受把异常继续抛出,这时整个Transactional会回滚。
在commit时spring会判断回滚标志,若检测到存在回滚标记, 则回滚事务并抛出UnexpectedRollbackException异常,客户端会收到500。
1.2 如果此时B抛异常throw,B会记录rollback,但A捕获try catch住,这里A是正常运行了(没有标记rollback),此时A和B在一事务里没有一致性,前后不一致,也就是因为这样,抛出了前面的UnexpectedRollbackException,不能回滚,程序正常的退出。
1.3 如果用require_new,A和B相互独立事物,互不影响。
1.4 如果A不加@Transactional,而B加@Transactional,此时A和B都不会生成事务。
https://www.cnblogs.com/milton/p/6046699.html
第一,在私有方法上加事务注解无效,B如果是私有方法,无效, 未回滚。
第二,普通接口方法A直接调用同类带事务的方法B, 无效, 未回滚,通过接口调用则有效。
 
 @Override
    public void txnInOpenPublicByInvokePublic() {
        //txnInOpenPublic(); // 无效
        testCase01.txnInOpenPublic(); // 有效
    }

1.5 在接口方法B上加事务, 再被他类的接口方法A调用, 无论此接口方法是否加事务, 都有效。
总结: Transactional是否生效, 仅取决于是否加载于接口方法, 并且是否通过接口方法调用(而不是本类调用)

通过动态代理,在代理类里,先开启事务,执行任务,成功则提交事务,异常则回滚事务,最后关闭事务。

也可以是require_new:如果有新事务挂起之前事务,然开启新事务。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics