资讯专栏INFORMATION COLUMN

Spring 事务嵌套的配置

BearyChat / 1312人阅读

摘要:问题在使用管理层事务时,会遇到方法事务嵌套的问题。如果当前存在事务,则在嵌套事务内执行。事务传递机制,有这样一个机制。所以在配置中添加的配置然后所有的事务都自动使用嵌套事务了,也不需要修改任何的代码和配置,可以在方法上去掉这段。

问题

在使用Spring管理Service层事务时,会遇到service方法事务嵌套的问题。
默认情况下,service方法有自己独立的事务,如果一个复杂的service方法中,调用了多个事务操作,中间抛出异常时,往往不会发生事务回滚。这时候我们需要一种自动的方式来完成回滚。

Spring的事务传递机制

PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与 PROPAGATION_REQUIRED 类似的操作。

事务传递机制,有PROPAGATION_NESTED这样一个机制。

当我们在service方法中配置了这个方式

@Transactional(propagation=Propagation.NESTED)
public void save(Entity entity) {
    //保存实体对象操作
}

运行之后系统异常, 提示当前配置不支持NESTED事务.

解决办法

查了一些代码后发现在HibernateTransactionManager中发现这样一段内容,其中有isNestedTransactionAllowed的判定。

protected Object doGetTransaction() {
    HibernateTransactionObject txObject = new HibernateTransactionObject();
    txObject.setSavepointAllowed(isNestedTransactionAllowed());
    //...
}

所以在Hibernate配置中添加nestedTransactionAllowed的配置


    
    

然后所有的事务都自动使用嵌套事务了,也不需要修改任何service的代码和配置,可以在service方法上去掉(propagation=Propagation.NESTED)这段。

注意

PS : 当出现Unchecked Exception时,就会回滚整个Service事务.
注意
(1)必须是Unchecked Exception才回滚
(2) 即使调用了Hibernate session的flush方法,也会被回滚

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64689.html

相关文章

  • Spring事务整理

    摘要:使用需要使用作为事务管理器。两个事务互不影响。这是默认的隔离级别,使用数据库默认的事务隔离级别下边的四个与的隔离级别相对应这是事务最低的隔离级别,它充许另外一个事务可以看到这个事务未提交的数据。这种事务隔离级别可 Spring事务整理 工作了几年了,今天抽时间整理一下spring的事务,说起spring的事务是面试的时候面试官经常提及的问题,接下来结合网上资料再总结下spring的事务...

    stackvoid 评论0 收藏0
  • Spring事务管理

    摘要:事务的传播行为当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。事务配置配置文件中关于事务配置总是由三个组成部分,分别是和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。 数据库事务的隔离级别 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted 、Read committed 、Repeatable read 、Serializabl...

    TalkingData 评论0 收藏0
  • 可能是最漂亮Spring事务管理详解

    摘要:事务隔离级别定义了一个事务可能受其他并发事务影响的程度我们先来看一下并发事务带来的问题,然后再来介绍一下接口中定义了五个表示隔离级别的常量。 Java面试通关手册(Java学习指南):https://github.com/Snailclimb/Java_Guide 微信阅读地址链接:可能是最漂亮的Spring事务管理详解 事务概念回顾 什么是事务? 事务是逻辑上的一组操作,要么都执行,...

    邹立鹏 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<