温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

spring中事务传播行为有哪些

发布时间:2021-11-17 10:09:09 来源:亿速云 阅读:121 作者:小新 栏目:大数据

这篇文章给大家分享的是有关spring中事务传播行为有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

事务传播行为整理

spring 的七中传播行为

  • PROPAGATION_REQUIRED

    • 标识当前方法必须在事务中执行

  • PROPAGATION_SUPPORTS

    • 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。

  • PROPAGATION_MANDATORY

    • 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。

  • PROPAGATION_REQUIRES_NEW

    • 使用PROPAGATION_REQUIRES_NEW,需要使用 JtaTransactionManager作为事务管理器。 它会开启一个新的事务。如果一个事务已经存在,则先将这个存在的事务挂起。

  • PROPAGATION_NOT_SUPPORTED

    • PROPAGATION_NOT_SUPPORTED 总是非事务地执行,并挂起任何存在的事务。

  • PROPAGATION_NEVER

    • 总是非事务地执行,如果存在一个活动事务,则抛出异常。

  • PROPAGATION_NESTED

    • 如果一个活动的事务存在,则运行在一个嵌套的事务中。 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。

PROPAGATION_REQUIRED

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

(1)调用methodB,因为当前上下文中没有事务,所以会新建一个事务。

(2)调用methodA,因为当前上下文中没有事务,所以会新建一个事务。但是,当执行到methodB时,方法B会被加入到methodA的事务中。

PROPAGATION_SUPPORTS

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
 methodB();
// do something
}
 
// 事务属性为SUPPORTS
@Transactional(propagation = Propagation.SUPPORTS)
public void methodB() {
    // do something
}

(1) 调用methodB,则以非事务的方法执行。

(2) 调用methodA,上下文没有事务,新建一个,而执行到methodB时,它自动加入到methodA的事务中。

PROPAGATION_MANDATORY

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
 methodB();
// do something
}
 
// 事务属性为MANDATORY
@Transactional(propagation = Propagation.MANDATORY)
public void methodB() {
    // do something

(1) 调用methodB时,上下文中没有事务,则会抛出异常。

(2) 调用methodA,上下文没有事务,新建一个,而执行到methodB时,它自动加入到methodA的事务中。

PROPAGATION_REQUIRES_NEW

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    doSomeThingA();
    methodB();
    doSomeThingB();
	// do something else
}
 
 
// 事务属性为REQUIRES_NEW
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {
    // do something
}

(1) 调用methodB会开启一个新的事务。

(2) 调用methodA时,methodA会开启事务,methodB也会开启一个新的事务,但是这两个事务互相独立。也就是说,如果methodA方法在调用methodB方法后的doSomeThingB方法失败了,而methodB方法所做的结果依然被提交。而除了 methodB之外的其它代码导致的结果却被回滚了

PROPAGATION_NOT_SUPPORTED

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    doSomeThingA();
    methodB();
    doSomeThingB();
	// do something else
}
 
 
// 事务属性为PROPAGATION_NOT_SUPPORTED 
@Transactional(propagation = Propagation.PROPAGATION_NOT_SUPPORTED)
public void methodB() {
    // do something
}

(1) 执行methodB。无事务。

(2) 执行methodA。当执行到方法B时,事务会被挂起,以非事务的方式执行methodB,然后事务恢复。

也就是methodB中有异常时,B不回滚,A回滚。

PROPAGATION_NEVER

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
 methodB();
// do something
}
 
// 事务属性为SUPPORTS
@Transactional(propagation = Propagation.SUPPORTS)
public void methodB() {
    // do something
}

(1) 单独执行methodB, 非事务执行。

(2) 执行 methodA ,当执行到methodB时,会抛出异常。

PROPAGATION_NESTED

@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
    doSomeThingA();
 	methodB();
    doSomeThingB();
	// do something
}
 
// 事务属性为NEWSTED
@Transactional(propagation = Propagation.NEWSTED)
public void methodB() {
    // do something
}

(1)单独执行methodB,则会开启一个事务。

(2)执行methodA,如果methodA的事务执行失败后,会回滚内部的methodB事务。但是,methodB事务执行失败后,并不会引起外层methodA事务的回滚。

感谢各位的阅读!关于“spring中事务传播行为有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI