`
什么世道
  • 浏览: 222809 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

org.hibernate.TransactionException: nested transactions not supported错误的解决方案

阅读更多

异常名称: org.hibernate.TransactionException: nested transactions not supported

异常分析You probably have begun a transaction, and trying to begin another one without having committed or rollbacked the previous one.(from stackoverflow.com)

简单得说就是在使用Hbernate框架时,在开启新的transaction时,原来的transaction事务却没有提交或者撤销,导致出现该异常。 我在这里加上一种情况,提交Transaction事务与开启的不一致![/size]


解决方案:第一种:就如大多数偷懒的做法,主动提交事务,去掉以下两行代码。 

session.beginTransation(); 
session.getTransaction().commit();

 

例如:  

public void addUser(User user){
Session session = HibernateUtil.getSession();  
try { 
   session.save(user);  
} catch (Exception e) {  
    e.printStackTrace(); 
   }
}

 
其实Hibernate本身是不具备Transaction处理功能的,Hibernate的Transaction实际上是底层的JDBC Transaction的封装,或者是JTA Transaction的封装。 

#hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory
#hibernate.transaction.factory_class net.sf.hibernate.transaction.JDBCTransactionFactory

 

如果你什么都不配置,默认情况下使用JDBCTransaction。

可以看Hibernate中关于JDBCTransactionFactory的部分

 

package org.hibernate.engine.transaction.internal.jdbc;

public class JdbcTransaction extends AbstractTransactionImpl {
   @Override
   protected void doBegin() {
       ...
       if ( wasInitiallyAutoCommit ) { 
           managedConnection.setAutoCommit( false );
       }
       ...
    }
}

 


转换到Transaction事务处理:当我们什么都不做时,直接使用save()方法(对于所有CURD操作试用), Hibernate使用的是session.setAutoCommit(true),对应到JDBC,就是connection.setAutoCommit(true);数据库就帮你给把事务代理了。

但一旦使用session.beginTransation()或者session.getTransation().begin(), Hibernate 将自动提交事物关闭:session.setAutoCommit(false),这是必须手动提交事务。


所以就引申出第二种解决方案:手动提交事务

在有自动提交事务的情况下,为什么要手动提交事务呢?主要是针对以后的高并发问题,手动提交事务可以更有效的控制高并发可能出现的各种问题。


其实,大多数是手动提交事务,但是代码写的不准确,比如说我。下面是不规范的代码

 

public void addUser(User user){  //错误代码
   Session session = HibernateUtil.getSession(); 
   session.beginTransaction(); 
   try { 
      session.save(user); 
      session.getTransaction().commit();
   } catch (Exception ef) {  
       ef.printStackTrace();  
   }
}

 

规范的写法是下面这种:保证是同一个事务。

 
]public void addUser(User user){  //正确写法
   Session session = HibernatUtil.getSession(); 
   Transaction tx = session.beginTransaction(); 
   try { 
      session.save(user); 
      tx.commit(); //事物必须提交
   } catch (Exception ef) { 
      if (null != tx) {
         tx.rollback();//撤销事务
         ef.printStackTrace(); 
      }
   }
}
 
1
0
分享到:
评论

相关推荐

    ERRORLOG

    org.hibernate.TransactionException: JDBC rollback failed

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

    3. 原理:Hibernate底层依赖于JDBC来与数据库进行交云,但它隐藏了JDBC API的复杂性。Hibernate通过使用Session和Transaction对象来管理与数据库的交互,它还提供了一个查询语言HQL用于对象查询。Hibernate的原理还...

    Could not roll back Hibernate transaction.doc

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

    hibernate错误汇总

    错误九:Exception in thread "main" org.hibernate.TransactionException: nested transactions not supported 错误原因:Hibernate不支持嵌套事务,即在一个事务中开启另一个事务。这通常是由于在已经处于事务...

    Hibernate配置常见错误

    错误表现:事务提交时出现“org.hibernate.TransactionException: Transaction was marked for rollback only; cannot commit”异常。 解决方案:检查事务的回滚规则,确保在try-catch块中正确处理事务。对于Spring...

    TransactionScope和分布式事务

    然而,分布式事务并非万能解决方案。正如描述中提到的,分布式事务并不能完全消除数据不一致性的风险,虽然它可以降低这种可能性。在处理大约5000万次操作时,出现了十几个错误,这样的错误率在某些情况下是可以接受...

    前端-后端java的Util类的工具类

    │ hibernate.cfg.xml │ HibernateDaoImpl.java │ HibernateSessionFactory.java │ HibernateUtil.java │ JsonUtil.java │ list.txt │ log4j.properties │ messageResource_zh_CN.properties │ spring.xml ...

    SPRING API 2.0.CHM

    HibernateInterceptor HibernateJdbcException HibernateJdbcException HibernateJpaDialect HibernateJpaVendorAdapter HibernateObjectRetrievalFailureException HibernateObjectRetrievalFailureException...

    Hibernate3.2 官方用户手册

    ### Hibernate 3.2 官方用户手册知识点详解 #### 一、概述 Hibernate 是一款开源的对象关系映射 (ORM) 工具,用于 Java 应用程序与数据库交互。它能够将 Java 对象自动持久化到关系型数据库中,从而简化了数据访问...

    事务的使用方法

    - **PROPAGATION_NOT_SUPPORTED**:以非事务的方式执行操作,如果当前存在事务,则挂起当前的事务。 - **PROPAGATION_NEVER**:以非事务方式执行,如果当前存在事务,则抛出异常。 - **PROPAGATION_NESTED**:如果...

    无处不在的Spring AOP事务及踩过的坑

    本文将深入探讨Spring AOP事务管理的核心概念、配置、以及可能遇到的问题和解决方案。 首先,我们需要理解什么是AOP。AOP是一种编程范式,用于将关注点(如日志、安全检查、事务管理)与主要业务逻辑解耦。在Spring...

    spring声明式事务处理demo

    默认情况下,如果方法抛出未检查异常(继承自RuntimeException的异常)或者TransactionException,Spring会回滚事务;否则,事务会在方法结束时提交。 ```java @Service public class UserService { @...

    详细介绍Spring事务管理

    TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; void commit(TransactionStatus status) throws TransactionException; void rollback(TransactionStatus ...

    spring_aop

    Spring AOP,全称Aspect Oriented Programming...同时,由于事务管理、安全检查、缓存和对象池管理等都是常见的系统性服务,Spring AOP为这些问题提供了统一的解决方案,使得我们的应用程序更加模块化和易于扩展。

    PHP ORM(面向对象PDO数据库框架&API框架)

    $result[0]) throw new TransactionException(PDO_ERROR_CODE, '更新用户失败', $result); }); echo_msg('注册成功'); //可以直接提交json,用下面方式接收 $newUser = request_object(); //$newUser = ...

    DBFlowBasic

    protected void onRun() throws TransactionException { // 在这里执行数据库操作 User user = new User().name("Jane").email("jane@example.com"); user.save(); } @Override protected void onFinish...

    dmrkved.rar_Java_

    3. **TransactionException.java** - 这个文件可能定义了一个自定义的异常类,用于在交易过程中捕获和处理错误或异常情况。 4. **i3package-info.java** - 这个文件通常用于提供包级别的注释,可能包含了关于这个包...

Global site tag (gtag.js) - Google Analytics