这篇文章给大家分享的是有关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 属性执行。
@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的事务中。
@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的事务中。
@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的事务中。
@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之外的其它代码导致的结果却被回滚了
@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回滚。
@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时,会抛出异常。
@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中事务传播行为有哪些”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。