事务传播七种行为

Spring中事务的定义:
Propagation(key属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。)有以下选项可供使用:
PROPAGATION_REQUIRED–支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS–支持当前事务,如果当前没有事务,就以非事务方式执行。(如果当前有事物,我就用当前事物,如果当前没有事物,就以非事物进行执行)
PROPAGATION_MANDATORY–支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW–新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED–以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER–以非事务方式执行,如果当前存在事务,则抛出异常。

@Transactional(
readOnly = false, // 读写事务
timeout = -1, // 事务的超时时间不限制
noRollbackFor = ArithmeticException.class, // 遇到数学异常不回滚
isolation = Isolation.DEFAULT, // 事务的隔离级别,数据库的默认
propagation = Propagation.REQUIRED // 事务的传播行为
)

事务传播行为:
Propagation.REQUIRED
指定当前的方法必须在事务的环境下执行;
如果当前运行的方法,已经存在事务, 就会加入当前的事务;
Propagation.REQUIRED_NEW
指定当前的方法必须在事务的环境下执行;
如果当前运行的方法,已经存在事务: 事务会挂起; 会始终开启一个新的事务,执行完后; 刚才挂起的事务才继续运行。

举例:
Class Log{
Propagation.REQUIRED
insertLog();
}

Propagation.REQUIRED
Void  saveDept(){
    insertLog();    // 加入当前事务
    .. 异常, 会回滚
    saveDept();
}


Class Log{
    Propagation.REQUIRED_NEW  
    insertLog();  

}

Propagation.REQUIRED
Void  saveDept(){
    insertLog();    // 始终开启事务
    .. 异常, 日志不会回滚
    saveDept();
}

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 591235401@qq.com

文章标题:事务传播七种行为

本文作者:阿杜同学

发布时间:2019-03-15, 19:42:21

最后更新:2019-03-15, 19:42:21

原始链接:http://yoursite.com/2019/03/15/%E4%BA%8B%E5%8A%A1%E4%BC%A0%E6%92%AD%E4%B8%83%E7%A7%8D%E8%A1%8C%E4%B8%BA/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录