多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[toc] 本节描述了Spring中事务传播的一些语义。 请注意,本节不适合作为事务传播的介绍; 相反,它详细介绍了Spring中有关事务传播的一些语义。 在Spring管理的事务中,要注意物理和逻辑事务之间的区别,以及传播设置如何应用于这种差异。 ## Required ![required](https://box.kancloud.cn/32e6ee200b1e99992bf0cfd8479b407b_800x341.png) ### PROPAGATION_REQUIRED `PROPAGATION_REQUIRED`强制执行物理事务:如果当前还没有事务存在,则在本地范围内执行,或者参与为更大范围定义的现有“外部”事务。 这是同一线程内公共调用堆栈排列的一个很好的默认值,例如 服务外观委托给几个存储库方法,其中所有底层资源都必须参与服务级事务。 默认情况下,参与事务将使用外部作用域事务的特征,静默忽略本地隔离级别,超时值或只读标志(如果有)。 如果您希望隔离级别声明在参与具有不同隔离级别的现有事务时被拒绝,请考虑在事务管理器上将“validateExistingTransactions”标志切换为“true”。 这种非宽松模式也将拒绝只读不匹配,即内部读写事务试图参与只读外部事务的。 当传播设置为`PROPAGATION_REQUIRED`时,将为应用该设置的每个方法创建逻辑事务范围。 每个这样的逻辑事务范围可以单独确定仅回滚状态,外部事务范围在逻辑上独立于内部事务范围。 当然,在标准`PROPAGATION_REQUIRED`行为的情况下,所有这些范围将映射到同一物理事务。 因此,内部事务范围中的仅回滚标记集确实会影响外部事务实际提交的机会(正如您所期望的那样)。 然而,如果内部事务标记为回滚,而外部事务仍然提交,则外部会收到内部抛出的异常`UnexpectedRollbackException`,并内部事务已回滚. ### RequiresNew ![](https://box.kancloud.cn/5b456aa88851b44d59cfdb54cea24cdb_800x276.png) 与`PROPAGATION_REQUIRED`相反,`PROPAGATION_REQUIRES_NEW`始终对每个受影响的事务范围使用独立的物理事务,从不参与外部范围的现有事务。 在这样的安排中,底层资源事务是不同的,因此可以独立提交或回滚,外部事务不受内部事务的回滚状态影响,并且内部事务的锁在完成后立即释放。 这样一个独立的内部事务也可以声明它自己的隔离级别,超时和只读设置,从不继承外部事务的特性。 ### Nested `PROPAGATION_NESTED`使用具有多个保存点的单个物理事务,它可以回滚到该事务。 这种部分回滚允许内部事务作用域触发其作用域的回滚,外部事务能够继续物理事务,尽管已经回滚了一些操作。 此设置通常映射到JDBC保存点,因此仅适用于JDBC资源事务。 请参阅Spring的`DataSourceTransactionManager`。