事务 传播行为

事务特性

原子性:事务最小的工作单元,不可再分
隔离性:事物之间相互隔离,保证互不干扰
一致性:事务要求要么同时成功,要么同时失败
持久性:持久性是事务结束的标志

spring事务传播行为

  • REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。

  • REQUIRES_NEW:新建事务。如果当前已存在一个事务,那么该事务将被挂起,直到新的事务执行完毕。如果没有当前事务,那么就会创建一个新的事务来执行。

  • SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。

  • NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起,直到非事务方式执行完毕。

  • MANDATORY:使用当前事务,如果当前没有事务,就抛出异常IllegalTransactionStateException。

  • NEVER:以非事务方式执行,如果当前存在事务,则抛出异常IllegalTransactionStateException。

  • NESTED:嵌套事务,如果当前存在事务,则在嵌套事务内执行。如果没有事务,则新建一个事务(REQUIRES_NEW)。

@Service("actServiceImpl")
public class ActServiceImpl1{
    @Resource(name = "actDaoImpl")
    private ActDao actDao;
    @Resource(name = "actServiceImpl2")
    private ActService actService2;

    @Transactional(propagation = Propagation.REQUIRED)
    void add1(){
        actDao.add(new Act("3", 10000));
        actService2.add();
    }

    @Transactional(propagation = Propagation.REQUIRED)
    void add2(){
        actDao.add(new Act("3", 10000));
        try {
            actService2.add();
        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }
}
@Service("actServiceImpl2")
public class ActServiceImpl2{
    @Resource(name = "actDaoImpl")
    private ActDao actDao;

    @Transactional(propagation = Propagation.NOT_SUPPORTED)
    public void add() {
        actDao.add(new Act("4", 10000));
        //只有表格中标记①②i=1/0处注释。
        //加入此处报错,会影响Act3号的的插入吗
        int i = 1 / 0;
    }
}
ActServiceImpl1(A) ActServiceImpl2(B) add1() add1()原因 add2() add2()原因
REQUIRED REQUIRED A×,B× 同一事务原子性操作,和B是否捕获异常无关 A×,B×
REQUIRED REQUIRES_NEW A×,B× AB各自有事务,A事务内调用B事务,B事务异常导致A异常。 A√,B× AB各自有事务,A事务内调用B事务,B捕获异常,A正常插入
REQUIRED PSUPPORTS A×,B× 同一事务原子性操作,和B是否捕获异常无关 A×,B×
无事务 SUPPORTS A√,B√ A、B都是非事务操作 A√,B√
REQUIRED NOT_SUPPORTED A×,B√ A事务方式,B以非事务方式加入A事务,影响A事务。 A√,B√ A事务方式,B以非事务方式加入A事务,B异常捕获,所以AB都插入成功。
无事务 NOT_SUPPORTED A√,B√ A、B都是非事务操作 A√,B√ A、B都是非事务操作
无事务 MANDATORY A√,B× B必须加入已有事务中,否则IllegalTransactionStateException① ①此处测试把i=1/0注释
REQUIRED MANDATORY A×,B× 同一事务原子性操作,和B是否捕获异常无关
REQUIRED NEVER A×,B× B不能加入已有事务中,否则IllegalTransactionStateException② A√,B× ②此处测试把i=1/0注释
无事务 NEVER A√,B√ A、B都是非事务操作 A√,B√
REQUIRED NESTED A×,B× B嵌套在A事务中,B异常导致A异常 A√,B× B嵌套在A事务中,B捕获异常
无事务 NESTED A√,B× A非事务操作,B事务新建一个事务,事务内运行。 A√,B×
posted @ 2024-07-30 20:42  干饭达人GoodLucy  阅读(8)  评论(0编辑  收藏  举报