spring中事务传播行为有哪些

发布时间:2021-11-17 10:09:09 作者:小新
来源:亿速云 阅读:147

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

事务传播行为整理

spring 的七中传播行为

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中事务传播行为有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

推荐阅读:
  1. Spring事务传播行为是什么?怎么用
  2. 如何解决Spring事务中传播行为的问题

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

spring

上一篇:在AngularJS中如何将XML转换为JSON

下一篇:jquery如何获取tr里面有几个td

相关阅读

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

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