spring:事务失效+事务传播行为

一、事务失效

1.@Transactional作用在非public上

    @Transactional
    void transferAccounts(){
        adminDao.sub();
        System.out.println(10/0);
        adminDao.add();
    }

只执行sub() 

2.异常被try catch捕获

    @Transactional
    public void transferAccounts(){
        adminDao.sub();
        try {
            System.out.println(10/0);
        }catch (Exception e){

        }
        adminDao.add();
    }

程序以为没有异常,将会都执行

3.出现编译期异常

    @Transactional
    public void transferAccounts() throws UnsupportedEncodingException {
        adminDao.sub();
        "a".getBytes("utf-9");
        adminDao.add();
    }

4.事务传播行为设置错误

5.数据库引擎不支持

数据库引擎为InnoDB时,支持事务

spring:事务失效+事务传播行为_第1张图片

 数据库引擎为MyISAM时,不支持事务spring:事务失效+事务传播行为_第2张图片

6.同一事务,使用非代理对象

二、事务传播行为

事务传播行为:当一个事务方法被另一个事务方法调用时,该事务方法如何执行。

Spring 定义的七种传播行为

spring:事务失效+事务传播行为_第3张图片

1. Propagation.REQUIRED

例如:在A事务中添加B事务

A中没有事务,B方法自己创建事务,B异常不影响A

A中有事务,调用B方法 ,B方法会加入A事务中,任意一方出现异常,都不会执行。

2. Propagation.REQUIRES_NEW

A中没有事务,B方法自己创建事务,B异常不影响A

A中有事务,调用B方法 ,B方法会创建事务,将A事务挂起,A出现异常不影响B

例如:A事务

spring:事务失效+事务传播行为_第4张图片

B事务 

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void saveLog(){
        logDao.saveLog();
        //System.out.println(10/0);
    }

 

 

你可能感兴趣的:(spring,java,后端)