spring事务原理3-事务的传播行为

事务的传播行为

在spring管理的事务中,需要认识到物理和逻辑事务的不同,并且如何设置这些不同。

  • PROPAGATION_REQUIRED

如果当前存在一个事务,则加入当前事务。如果不存在任何事务,则创建一个新的事务。总之,要至少保证在一个事务中运行。PROPAGATION_REQUIRED通常作为默认的事务传播行为。

  • PROPAGATION_SUPPORTS

如果当前存在一个事务,则加入当前事务。如果当前不存在事务,则直接执行。对于一些查询方法来说,PROPAGATION_SUPPORTS通常是比较合适的传播行为选择。

  • PROPAGATION_MANDATORY

PROPAGATION_MANDATORY 强制要求当前存在一个事务,如果不存在,则抛出异常.

  • PROPAGATION_REQUIRES_NEW

不管当前是否存在事务,都会创建新的事务。如果当前存在事务,会将当前的事务挂起(Suspend)。如果某个业务对象所做的事情不想影响到外层事务,PROPAGATION_REQUIRES_NEW 应该是合适的选择。比如,假设当前的业务方法需要向数据库中更新某些日志信息,但即使这些日志信息更新失败,我们也不想因为该业务方法的事务回滚,而影响到外层事务的成功提交。因为这种情况下,当前业务方法的事务成功与否对外层事务来说是无关紧要的。

  • PROPAGATION_NOT_SUPPORTED

不支持当前事务,而是在没有事务的情况下执行。如果当前存在事务的话,当前事务原则上将被挂起(Suspend).

  • PROPAGATION_NEVER

永远不需要当前存在事务,如果存在当前事务,则抛出异常。

  • PROPAGATION_NESTED

如果存在当前事务,则在当前事务的一个嵌套事务中执行,否则与PROPAGATION_REQUIRED 的行为类似,即创建新的事务,在新创建的事务中执行.

PROPAGATION_NESTED事务是依赖的吧,不可分割的,PROPAGATION_REQUIRES_NEW是独立的,相互分离的。

PROPAGATION_NESTED uses a single physical transaction with multiple savepoints that it can roll back to. Such partial rollbacks allow an inner transaction scope to trigger a rollback for its scope, with the outer transaction being able to continue the physical transaction despite some operations having been rolled back. This setting is typically mapped onto JDBC savepoints, so will only work with JDBC resource transactions. See Spring’s DataSourceTransactionManager.