@transactional
是声明式事务的注解,可以被标记在类上
、接口
、方法
上。bean
的名称,这个主要用于多事务管理器情况下指定。比如多数据源配置的情况下。isolation.default
。isolation.default
:事务默认的隔离级别,使用数据库默认的隔离级别。isolation.read_uncommitted
:这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻读。isolation.read_committed
:保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻读。isolation.repeatable_read
:这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻读。isolation.serializable
:这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻读。propagation.required
。propagation.required
:如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。比如a方法内部调用了b方法,此时b方法将会使用a方法的事务。propagation.mandatory
:支持当前事务,如果当前没有事务,就抛出异常。propagation.never
:以非事务方式执行,如果当前存在事务,则抛出异常。propagation.not_supported
:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。propagation.requires_new
:新建事务,如果当前存在事务,把当前事务挂起。比如a方法使用默认的事务传播属性,b方法使用requires_new
,此时a方法在内部调用b方法,一旦a方法出现异常,a方法中的事务回滚了,但是b方法并没有回滚,因为a和b方法使用的不是同一个事务,b方法新建了一个事务。propagation.nested
:支持当前事务,新增savepoint
点,也就是在进入子事务之前,父事务建立一个回滚点,与当前事务同步提交或回滚。 子事务是父事务的一部分,在父事务还未提交时,子事务一定没有提交。嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。runtimeexception
和error
上回滚。public
方法进行代理,源码依据在abstractfallbacktransactionattributesource
类中的computetransactionattribute
方法中,如下:protected transactionattribute computetransactionattribute(method method, class<?> targetclass) { // don't allow no-public methods as required. if (allowpublicmethodsonly() && !modifier.ispublic(method.getmodifiers())) { return null; }
public
修饰的方法上并不会抛出异常,但是会导致事务失效。try-catch
,导致异常无法抛出,自然会导致事务失效。伪代码如下:@transactional public void method(){ try{ //插入一条数据 //更改一条数据 }catch(exception ex){ return; } }
a方法
(未标注声明式事务)在内部调用了b方法
(标注了声明式事务),这样会导致b方法中的事务失效。public class test{ public void a(){ //插入一条数据 //调用b方法 b(); } @transactional public void b(){ //插入数据 } }
@transactional
注解的类生成一个代理类(proxy),当有注解的方法被调用的时候,实际上是代理类调用的,代理类在调用之前会开启事务,执行事务的操作,但是同类中的方法互相调用,相当于this.b()
,此时的b方法并非是代理类调用,而是直接通过原有的bean直接调用,所以注解会失效。propagation.required
,但是一旦配置了错误的传播属性,也是会导致事务失效,如下三种配置将会导致事务失效:
context:component-scan
并且同时扫描了service层,此时事务将会失效。
如对本文有疑问, 点击进行留言回复!!
荐 嵌入式linux开发环境搭建(Docker版,基于iTop 4412开发板)
SpringBoot项目部署到服务器之 Liunx环境安装jdk详细步骤
网友评论