spring @Transactional 事务传播行为

本文深入探讨了Spring AOP的事务管理,包括默认的回滚策略——仅针对RuntimeException回滚,以及如何通过@Transactional注解自定义回滚规则。同时,分析了事务可能失效的情况,如多线程操作、异常被捕获等。此外,详细解释了propagation=Propagation.REQUIRED的传播行为,展示了不同场景下事务的组合与交互。
摘要由CSDN通过智能技术生成

1,回滚异常

基于Spring AOP的事务管理,即声明式事务管理,默认是针对RuntimeException回滚,既默认只对RuntimeException()及其子类进行事务回滚;非运行时类型的异常默认是不会回滚的(new Exception())。

可以指定@Transactional(rollbackFor = Exception.class)

2,异常失效

1,多线程当中(一个事务操作内不能有多线程操作。会导致事务失效,且异常捕获不到)。

2,异常被自己捕获

3,在自己的回滚异常之外

4,数据库引擎不支持事务

5,注解所在类未被加载成bean被spring管理

6,方法未被public修饰

7,自身调用(调该类自己的方法,而没有经过 Spring 的代理类,结合下面b和d两点)

3,spring默认的传播行为 propagation = Propagation.REQUIRED

业务方法需要在一个事务中运行,如果方法运行时,已处在一个事务中,那么就加入该事务,否则自己创建一个新的事务。

a,单独一个方法,方法A会在事务中运行

@Transactional(propagation = Propagation.REQUIRED)
// 等同于@Transactional()
public void methodA() {
    // TODO: do something   
}

b, 一个方法调用另一个方法,方法B也会加入到方法A中的事务来(自身调用也有效),方法B异常也会导致A回滚。

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // TODO: do something
    methodB();
}

public void methodB() {
    // TODO: do something
}

c, 一个方法调用另一个方法,两个方法都开启事务,方法B会加入到A中,共用一个事务。就算B出现异常在A中被捕获也会导致整个事务回滚。(前提条件:非自身调用,methodB为其他类的方法)。如果为自身调用,B方法出现异常也会导致A回滚,但是如果此时捕获了B的异常的话A,B都不会回滚(自身调用可以理解为代码合并为一个方法,try,catch方法B就相当于在同一个方法内部进行处理了,对外时无感知的 

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    // TODO: do something
    try {
        methodB();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
@Transactional(propagation = Propagation.REQUIRED)
public void methodB() {
    // TODO: do something
}

}

d,自身调用情况下,方法A没开启事务,方法B开启事务,这时B是无效的。(非自身调用则是有效的)

public void methodA() {
        methodB();
    }

    @Transactional(propagation = Propagation.REQUIRED)
    public void methodB() {
         // TODO: do something
        throw new RuntimeException();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值