说说 Spring 事务的传播行为

版权声明:如果喜欢,就点个赞呗 O(∩_∩)O~ https://blog.csdn.net/deniro_li/article/details/88775972

当我们调用一个基于 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 ,并且支持保存点事务机制 。

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

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

猜你喜欢

转载自blog.csdn.net/deniro_li/article/details/88775972