您的足迹:首页 > 数据库 >spring嵌套事务

spring嵌套事务

PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。

可能大家对PROPAGATION_NESTED还不怎么了解,觉得有必要再补充一下^_^!
 PROPAGATION_NESTED: 嵌套事务类型,是相对上面提到的六种情况(上面的六种应该称为平面事务类型),打个比方我现在有一个事务主要有一下几部分:
1,从A用户帐户里面减去100元钱
2,往B用户帐户里面添加100元钱

这样看和以前不同的事务可能没有什么区别,那我现在有点特殊的要求就是,A用户有3个帐户,B用户有2个帐户,现在我的要求就是只要再A用户的3个帐户里面任意一个减去100元,往B用户的两个帐户中任意一个里面增加100元就可以了!

一旦你有这样的要求那嵌套事务类型就非常适合你!我们可以这样理解,

一:将“从A用户帐户里面减去100元钱” 和 “往B用户帐户里面增加100元钱”我们暂时认为是一级事务操作

二:将从A用户的3个帐户的任意一个帐户里面减钱看做是“从A用户帐户里面减去100元钱”这个一级事务的子事务(二级事务),同样把后面存钱的看成是另一个的二级事务。

问题一:当二级事务被rollback一级事务会不会被rollback?

答案是不会的,二级事务的rollback只针对自己。

问题二:什么时候这个一级事务会commit,什么时候会被rollback呢?

我们主要看二级里面出现的情况,当所有的二级事务被commit了并且一级事务没有失败的操作,那整个事务就算是一个成功的事务,这种情况整个事务会被commit。

当任意一个二级事务没有被commit那整个事务就是失败的,整个事务会被roolback。

还是拿上面的例子来说明吧!如果我在a的三个帐户里面减钱的操作都被二级事务给rollback了,也就是3个帐户里面都没有减钱成功,整个事务就失败了就会被rollback。如果A用户帐户三个帐户里面有一个可以扣钱而且B用户的两个帐户里面也有一个帐户可以增加钱,那整个事务就算成功的,会被 commit。

PROPAGATION_REQUIRES_NEWPROPAGATION_NESTED与其他策略不同的是,当二级事务回滚时,一级事务是不回滚的,而这两者的区别在于,当一级事务回滚时,二级事务PROPAGATION_REQUIRES_NEW也不回滚,但PROPAGATION_NESTED会回滚
本博客所有文章如无特别注明均为原创。作者:小天复制或转载请以超链接形式注明转自 钟天才的博客
原文地址《spring嵌套事务

相关推荐

网友评论(0)