Spring事务

事物传播行为介绍: 

  @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:Transaction rolled back because it has been marked as rollback-only,程序虽然正常退出,提交不成功。 

因为AB是在同一个事务里,事务标识rollback已经标记了,但是还是运行完成,抛出回滚标识出乎意料,catch也没有用

https://blog.csdn.net/qq_42216791/article/details/105684663

Java代码 

 收藏代码

  1. @Override  
  2.    public void txnInOpenPublicByInvokePublic() {  
  3.        //txnInOpenPublic(); // 无效  
  4.        testCase01.txnInOpenPublic(); // 有效  
  5.    }  


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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值