spring中的Transactional

@Transaction注解的参数

 常用的属性

 propagation :这个属性其实是相对于调用者来设置的而不是方法里面的被调用者

REQUIRED :支持当前事务,如果事务不存在那么就创建一个事务。 同时也是事务的默认值

SUPPORTS: 支持当前事务,如果没有事务那么就当成没有事务进行

MANDATORY: 支持当前事务如果不存在那么就抛出异常

 REQUIRES_NEW:创建一个新事物,如果当前有事务存在那么就暂停当前事务

NOT_SUPPORTED :以非事务的方式进行,如果有事务那么就暂停事务

NEVER:以非事务的方式进行,如果有事务那么就抛出异常

NESTED:如果当前事务存在那么就嵌套在事务中执行

timeout :过期时间 

如果超过该过期时间没有完成,那么就进行回滚

isolation:从后面枚举的属性可以看出来是数据库的隔离级别

 default就是默认使用数据库的隔离级别。

readonly 事务的可读性 默认为false

如果是读取数据可以设置为true

rollbackFor : 什么时候回滚

不指定异常类型,默认为error和RuntimeException异常,所以可以自定义异常

事务失效的几种场景

一:@Transactional没有放在public方法上面 这里判断是否是public类型

二.@Transactional 的propagation属性设置错误

这三种事务不会抛出异常 

三.@Transactional rollbackfor不指定异常类型一些自定义异常的不会进行回滚。

四.同一个类中的方法调用,导致Transactional注解失效

它的一个方法A,A再调用本类的方法B ,但方法A没有声明注解事务,而B方法有。则外部调用方法A之后,方法B的事务是不会起作用的。这也是经常犯错误的一个地方。

五.数据库引擎不支持事务

六。cache住异常不会发生回滚

实现:

 

 

 可以看到虽然update方法添加了事务注解但是其实是不生效的,其实失效原因就是四

解决方案一 就是给外层方法加注解

数据进行了回滚

本质其实是事务发生在了selectUser方法进行了回滚,但是其实updateBrowser的事务还是没有生效

因为调用update方法不是代理对象,事务基于aop代理对象进行的所以我们需要使用代理对象

二: 注入自己 因为spring已经解决了循环依赖的问题

三:getbean

 

 

有一种情况是异常被cache的时候能不能回滚

cache住的异常不能发生回滚

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值