预计阅读时间: 10分钟
事务的传播
什么是事务的传播?传播,意味着是有两个事务参与的,单个事务是没有 ”传播“ 的概念的
事务的传播机制(propagation behavior
),即为在一个事务方法中调用另一个事务方法时,事务该如何执行。
7种传播属性
首先简要介绍事务的7种传播属性,事务方法 methodA
调用事务方法 methodB
传播属性 | 含义 | |
---|---|---|
PROPAGATION_REQUIRED | required 含义是 必须有事务 , 如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。 | 没有创建 【默认】 |
PROPAGATION_SUPPORTS | supports 是支持事务,但是单独调用该方法时是没有事务的,如果调用者已经开启了事务,就用调用者的事务。 | 有就用,没有拉到 |
PROPAGATION_MANDATORY | mandatory 意为 强制的 ,必须有事务,但是自己又不创建,如果调用者已经开启了事务,就用调用者的事务。调用者没开启事务,就抛异常。 | 不创建,没有告警 |
PROPAGATION_REQUIRES_NEW | new 创建新的事务,不管调用者有没有事务,都会新创建一个事务。原来如果已经有的话就把已经有的挂起。两个事务是独立的,事务A中在提交事务B后如果 rollback 并不会导致事务B 的 rollback 。需要使用 JtaTransactionManager作为事务管理器 | 挂起别人的,创建自己的 |
PROPAGATION_NOT_SUPPORTED | not_supported 即为 不支持事务 , 调用者如果已有事务就把它挂起,自己以无事务运行。需要使用 JtaTransactionManager作为事务管理器 | 挂起别人的,我不用 |
PROPAGATION_NEVER | never 从来都不需要事务的,如果调用者已有事务,就报错! | 别人有就报错 |
PROPAGATION_NESTED | nested 嵌套的事务,自己会创建一个新事务,但是这个新事务并不是自己单独提交的,而是等待外层事务一起提交,所以事务B后面 事务 A中的其他代码如果造成了 rollback 则也会导致事务B rollback | 嵌套 |