spring数据库事务的传播行为(propagation)

原创 创建时间:2020-03-06 访问量:6 赞:0 踩:0

传播行为是方法之间调用事务采取的策略问题。在绝大部分的情况下,我们会认为数据库事务要么全部成功,要么全部失败。但现实中也许会有特殊的情况。例如,执行一个批量程序,它会处理很多的交易,绝大部分交易是可以顺利完成的,但是也有极少数的交易因为特殊原因不能完成而发生异常,这里我们不应该因为极少数的交易不能完成而回滚批量任务调用的其他交易,使得那些本能完成的交易也变为不能完成了。此时,我们真实的需求是,在一个批量任务执行的过程中,调用多个交易时,如果有一些交易发生异常,中是回滚那些出现异常的交易,而不是整个批量任务,这样就能够使行那些没有问题的交易可以顺利完成,而有问题的交易则不做任何事情。

在Spring中,当一个方法调用另外一个方法时,可以让事务采取不同的策略工作,如新建事务或者挂起当前事务等,这便是事务的传播行为。如果批量任务作为当前事务,当它调用单个交易时,称单个交易为子方法,当前方法调用子方法的时候,让每个子方法不在当前事务中执行,而是创建一个新事务去执行子方法,我们就说当前方法调用子方法的传播行为为新建事务。此外,还可能让子方法在无事务、独立事务中执行,这些完全取决于你的业务需求。

1、传播行为的定义

REQUIRED

需要事务,它是默认传播行为,如果当前存在事务,就沿用当前事务,否则新建一个事务运行子方法。

SUPPORTS

支持事务,如果当前存事务,就沿用当前事务,如果不存在,则继续采用无事务的方式运行子方法。

MANDATORY

必须使用事务,如果当前没有事务,则会抛出异常,如果存在当前事务,就沿用当前事务。

REQUIRES_NEW

无论当前事务是否存在,都会创建新事务运行方法,这样新事务就可以拥有新的锁和隔离级别等特性,与当前事务相互独立。

NOT_SUPPORTED

不支持事务,当前存在事务,将挂起事务,运行方法

NEVER

不支持事务,如果当前方法存在事务,则抛出异常,否则继续使用无事务机制运行

NESTED

在当前方法调用子方法时,如果子方法发生异常,只回滚子方法执行过的SQL,而不回滚当前方法的事务。

评论
 我想说:
==已经到底了==
关注: 粉丝: 积分:
工联信息网
如有问题请致邮箱:need@glxxw2018.com
不良信息反馈及建议请致邮箱:accusation@glxxw2018.com