`

Hibernate不支持Nested Transaction

阅读更多
Spring-Orm中HibernateTransactionManager类文档中均有一段话:
引用
On JDBC 3.0, this transaction manager supports nested transactions via JDBC 3.0 Savepoints. The AbstractPlatformTransactionManager.setNestedTransactionAllowed(boolean) "nestedTransactionAllowed"} flag defaults to "false", though, as nested transactions will just apply to the JDBC Connection, not to the Hibernate Session and its cached objects. You can manually set the flag to "true" if you want to use nested transactions for JDBC access code which participates in Hibernate transactions (provided that your JDBC driver supports Savepoints). Note that Hibernate itself does not support nested transactions! Hence, do not expect Hibernate access code to semantically participate in a nested transaction.

也就是说,Hibernate根本就不支持Nested Transaction,最新的Hibernate4也是如此。在配置文件中设置"nestedTransactionAllowed=true",其实只对JDBC事务起效(如使用Spring的JdbcTemplate)。

经过测试,Hibernate框架托管下的Nested Transaction方法(子事务)抛出异常时,Spring日志会提示Rolling back transaction to savepoint,不过所谓“回滚”的是使用JDBC操作的内容,如果事务中没有JDBC操作等于是没有效果的。子事务操作会被保存到Hibernate的缓存中,并在下一次flush时被提交。

参考代码:http://www.iteye.com/problems/81929

参考:
http://cowbane.iteye.com/blog/504270
解惑 spring 嵌套事务
http://www.iteye.com/topic/482984
Spring Nested 事务之再解惑
http://forum.springsource.org/showthread.php?62656-Unable-to-roll-back-when-transaction-propagation-quot-NESTED-quot
Unable to roll back when transaction propagation="NESTED"
http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/orm/hibernate3/HibernateTransactionManager.html
org.springframework.orm.hibernate3.HibernateTransactionManager
分享到:
评论

相关推荐

    Could not roll back Hibernate transaction.doc

    nested exception is org.hibernate.TransactionException: JDBC rollback failed 这表明Hibernate事务回滚操作失败,导致事务不能正确回滚。 二、问题原因 该问题的主要原因是手动对数据库做了些操作,导致...

    struts-hibernate-nested-demo学习实例

    在学习过程中,深入理解Action和ActionForm的工作原理,以及Hibernate的Session和Transaction管理是非常关键的。此外,还要掌握如何处理表单提交,验证用户输入,以及如何在Service层进行业务逻辑处理。对于嵌套的...

    Hibernate4(关系映射-事务-原理-性能和二级缓存-最佳实践)

    Hibernate通过使用Session和Transaction对象来管理与数据库的交互,它还提供了一个查询语言HQL用于对象查询。Hibernate的原理还包括它如何利用延迟加载、代理对象等机制来优化性能。 4. 性能优化:Hibernate框架在...

    Spring在Transaction事务传播行为种类

    - **适用场景**:适用于某些不需要强制事务支持但可以接受事务的方法调用。 ##### 3. PROPAGATION_MANDATORY - **描述**:使用当前的事务,如果当前没有事务,则抛出异常。 - **适用场景**:适用于必须在事务上下文...

    hibernate错误汇总

    错误原因:Hibernate不支持嵌套事务,即在一个事务中开启另一个事务。这通常是由于在已经处于事务状态的Session中再次调用了beginTransaction()。 解决方案:避免在已经存在事务的环境中再次开始新的事务。如果需要...

    hibernate错误解决方案

    nested exception is org.hibernate.PropertyNotFoundException: Could not find a getter for ID in class ``` 这表示Hibernate找不到实体类中的 ID 属性的 getter 方法。 **解决方法**: 1. **实体类定义**:...

    springboot-transaction事务

    - 事务管理器(Transaction Manager):在Spring Boot中,如果检测到JPA或Hibernate,将会自动配置一个`PlatformTransactionManager`实例。 2. **JPA集成** - JPA是Java提供的ORM(Object-Relational Mapping)...

    Spring控制Hibernate中的事务传播特性与隔离级别操作.docx

    虽然它不是直接与Hibernate相关,但在处理数据库事务时,也可以与HibernateTemplate一起使用,为非Hibernate操作提供事务支持。 在Spring中,事务的传播特性(Transaction Propagation)决定了在一个事务方法被调用...

    hibernate事务管理

    Hibernate支持四种标准的事务隔离级别,它们分别是READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ和SERIALIZABLE。不同的隔离级别会影响并发控制和脏读、不可重复读、幻读等问题。在Spring中,可以通过@...

    hibernate相关基础

    Hibernate 支持一对一、一对多、多对一、多对多等多种关联关系的映射: 1. **一对一映射**:使用 `<one-to-one>` 元素表示,通常用于表示两个实体之间一对一的关系。 2. **一对多映射**:使用 `<set>` 或 `<bag>`...

    Spring AOP管理Hibernate事务(TransactionInSpringAOP)

    其他的传播行为还包括PROPAGATION_SUPPORTS、PROPAGATION_MANDATORY、PROPAGATION_REQUIRES_NEW、PROPAGATION_NOT_SUPPORTED、PROPAGATION_NEVER和PROPAGATION_NESTED等,各有不同的应用场景。 5. **事务隔离级别**...

    用户注册和登录是每个系统的必须存在的一部分,基于Dwr+Struts2+Spring+Hibernate写了一个用户登录注册系统

     压缩文件中不包含Jar文件(由于全部的Jar将近12M,不能全部上传),所用到的Jar目录为,工程中再也不会出现由于MyEclipse自动整合而出现的大量Jar文件 : Java代码 1. //如果不用,启动时不会出错,但使用Dwr时,会...

    Hibernate3事务管理[借鉴].pdf

    <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <!-- 配置事务属性,如隔离级别、传播行为等 --> (* com.example.service.*.*(..))" ...

    SpringHibernate事务及传播特性

    在Hibernate中,事务管理通常通过Session接口进行,包括beginTransaction()、commit()和rollback()方法。但当与Spring结合时,我们可以利用Spring的PlatformTransactionManager来管理Hibernate的事务,这样可以更好...

    Spring+Struts2+Spring3+Hibernate3三大框架整合

    PROPAGATION_NESTED则依赖于JDBC3.0的保存点技术,可以在子事务失败时恢复到保存点,而不影响整个事务。 整合Spring、Struts2和Hibernate3,开发者可以获得强大的控制力,实现灵活的事务管理和高效的数据访问,从而...

    springboot-transaction-demo:对于Spring事务的简单测试

    - **PlatformTransactionManager**:这是Spring提供的事务管理接口,通过实现这个接口,可以为不同的数据库提供事务管理服务,例如HibernateTransactionManager适用于JPA/Hibernate,DataSourceTransactionManager...

    springTranction

    没有则不开启新事务)、MANDATORY(如果已有事务就加入,否则抛出异常)、NOT_SUPPORTED(总是不开启事务,如果已有事务则挂起)、NEVER(如果有事务则抛出异常,否则不开启事务)以及NESTED(如果已有事务,则在...

    Spring事务管理配置

    除了`PROPAGATION_REQUIRED`外,Spring还支持其他几种传播行为,包括但不限于: - `PROPAGATION_SUPPORTS`:如果当前存在事务,则支持该事务;如果不存在事务,则以非事务方式执行。 - `PROPAGATION_MANDATORY`:...

    注解实现声明式事务管理

    否则抛出异常)、REQUIRES_NEW(总是新建事务,如果已有事务则挂起)、NOT_SUPPORTED(不支持事务,如果已有事务则挂起)、NEVER(永不启动事务,如果已启动则抛出异常)和NESTED(如果已有事务,则在嵌套事务内运行...

Global site tag (gtag.js) - Google Analytics