mysql事务传播方式

目录

1.1 REQUIRED

1.2 SUPPORTS

1.3 MANDATORY

1.4 REQUIRES_NEW

情况i:

情况ii:

情况iii:

1.5 NOT_SUPPORTED

1.6 NEVER

1.7 NESTED

情况i:

情况ii:


1.1 REQUIRED

(默认的传播属性值)

如果当前已经存在事务,那么加入该事务,如果不存在事务,创建一个事务

1.2 SUPPORTS

当前线程存在事务,挂起当前事务,执行完后,恢复挂起的事务(可以认为无事务执行,sql的提交完全依赖于 defaultAutoCommit属性值)

class ALL {
    @Transaction(rollbackFor = Exception.class)
    all() {
        A.a();
        @Transaction(propagation=Propagation.SUPPORTS, rollbackFor = Exception.class)
        B.b(){
            do sql 1;
                1/0;
            do sql 2;
        };
    }
}

由于all() 开启事物,B.b()执行的时候开启是一个空事物(执行的时候没有事务)

这个时候,sql 1 是否回滚,取决于是否开启了自动提交功能

1.3 MANDATORY

当前必须存在一个事务,否则抛出异常

1.4 REQUIRES_NEW

事务不存在创建一个新的,事务存在则创建一个子事务(子事务发生异常回滚 导致 主事务回滚)

情况i:

class ALL {
    @Transaction(rollbackFor = Exception.class)
    all() {
        @Transaction(propagation=Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
        A.a();
        B.b();
        1/0;
    }
}

A.a() 是子事务,子事务发生异常,能够正常回滚

当代码执行到第7行的时候,会出现导致B.b()回滚,A.a()不会发生回滚

情况ii:

class ALL {
    @Transaction(rollbackFor = Exception.class)
    all() {
        A.a();
        @Transaction(propagation=Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
        B.b();
    }
}

B.b() 是子事务,子事物发生异常,B.b()执行的内容能够正常的回滚

all() 主事务也能够正常的回滚

情况iii:

class ALL {
    @Transaction(rollbackFor = Exception.class)
    all() {
        A.a();
        try {
            @Transaction(propagation=Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
        	B.b();    
        } catch{
            
        }
        
    }
}

B.b() 是子事务,子事物发生异常,B.b()执行的内容能够正常的回滚

由于B.b() 的异常被手动捕获处理了,all() 主事务不受影响

1.5 NOT_SUPPORTED

如果当前存在事务,挂起当前事务,然后新的方法在没有事务的环境中执行,没有spring事务的环境下,sql的提交完全依赖于 defaultAutoCommit属性值(是否自动提交)

class ALL {
    @Transaction(rollbackFor = Exception.class)
    all() {
        A.a();
        @Transaction(propagation=Propagation.NOT_SUPPORTED)
        B.b(){
            do sql 1;
            1/0;
            do sql 2;    
        };
    }
}

B.b() 执行的时候不参与到主事务中(这个时候sql 1 是否提交取决于是否开启自动提交配置),

主事务是否会滚取决于是否有异常抛出,因为B.b() 的异常没有进行捕获,所以A.a() 执行的内容会回滚

1.6 NEVER

如果当前存在事务,则抛出异常,否则在无事务环境上执行代码

1.7 NESTED

all()是嵌套事物, A.a()是子事务(实际效果和默认的事物传播机制一样)

嵌套事务呈现父子事务概念,二者之间是有关联的,核心思想就是子事务不会独立提交,而是取决于父事务,当父事务提交,那么子事务才会随之提交;如果父事务回滚,那么子事务也回滚

情况i:

class ALL {
    @Transaction(rollbackFor = Exception.class)
    all() {
        @Transaction(propagation=Propagation.REQUIRES_NESTED, rollbackFor = Exception.class)
        A.a(){
            do sql 1;
                1/0;
            do sql 2;
        };
        B.b();
    }
}

A.a() 子事务发生异常,A.a()发生回滚,all()外部大事物是否回滚取决于是否对A.a() 进行捕获

情况ii:

class ALL {
    @Transaction(rollbackFor = Exception.class)
    all() {
        @Transaction(propagation=Propagation.REQUIRES_NESTED, rollbackFor = Exception.class)
        A.a();
        B.b();
        1/0;
    }
}

外部事务抛出了异常,整个大事务都会回滚

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值