说说 Spring 事务的传播行为

  • 时间:2019-03-26 01:44 作者:deniro 来源:deniro 阅读:645
  • 扫一扫,手机访问
摘要:当我们调用一个基于 Spring 的 Service 接口方法(比方 AccountService#addr() )时,它将运行在 Spring 管理的事务环境中, 这个方法可能会在内部调用其它的 Service 接口方法以共同完成一个完整的业务操作,因而就会发生服务接口方法嵌套调用的场景, 这时

当我们调用一个基于 Spring 的 Service 接口方法(比方 AccountService#addr() )时,它将运行在 Spring 管理的事务环境中, 这个方法可能会在内部调用其它的 Service 接口方法以共同完成一个完整的业务操作,因而就会发生服务接口方法嵌套调用的场景, 这时, Spring 会通过事务传播行为,来控制当前事务,应该如何传播到被嵌套调用的目标服务接口方法中 。

Spring 在 TransactionDefinition 接口中规定了 7 种类型的事务传播行为:

事务传播行为说明
PROPAGATION_REQUIRED假如当前没有事务,就新建一个事务;假如已经存在一个事务中,那么就加入。(常用)
PROPAGATION_SUPPORTS使用当前事务;假如当前没有事务,那么就以非事务的方式执行。
PROPAGATION_MANDATORY使用当前的事务;假如当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW新建事务;假如当前已存在事务,那么就挂起当前事务。
PROPAGATION_NOT_SUPPORTED以非事务方式执行;假如当前存在事务,那么就挂起当前事务。
PROPAGATION_NEVER以非事务方式执行;假如当前存在事务,那么就抛出异常。
PROPAGATION_NESTED假如当前存在事务,则在嵌套事务内执行;假如当前没有事务,则执行PROPAGATION_REQUIRED 情况下的操作 。

使用 PROPAGATION_NESTED 时,底层数据源必需基于 JDBC 3.0 ,并且支持保存点事务机制 。

在事务的解决过程中,假如发生错误进行了回滚 ,那么将撤销事务内对数据库的所有操作。在一个庞大的事务中,这是极其白费资源的。假设事务前半部分执行正确的,而事务的后半部分抛错,那么我们可以回滚到前半部分的结束位置,这时即可以使用保存点来实现。

一个事务可以建立多个保存点,将事务分割成一系列的部分。 这样,事务回滚时,即可以回滚到其中的某个保存点上,从而节约资源。

  • 全部评论(0)
手机二维码手机访问领取大礼包
返回顶部