异常名称: 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(); } } }
相关推荐
org.hibernate.TransactionException: JDBC rollback failed
3. 原理:Hibernate底层依赖于JDBC来与数据库进行交云,但它隐藏了JDBC API的复杂性。Hibernate通过使用Session和Transaction对象来管理与数据库的交互,它还提供了一个查询语言HQL用于对象查询。Hibernate的原理还...
nested exception is org.hibernate.TransactionException: JDBC rollback failed 这表明Hibernate事务回滚操作失败,导致事务不能正确回滚。 二、问题原因 该问题的主要原因是手动对数据库做了些操作,导致...
错误九:Exception in thread "main" org.hibernate.TransactionException: nested transactions not supported 错误原因:Hibernate不支持嵌套事务,即在一个事务中开启另一个事务。这通常是由于在已经处于事务...
错误表现:事务提交时出现“org.hibernate.TransactionException: Transaction was marked for rollback only; cannot commit”异常。 解决方案:检查事务的回滚规则,确保在try-catch块中正确处理事务。对于Spring...
然而,分布式事务并非万能解决方案。正如描述中提到的,分布式事务并不能完全消除数据不一致性的风险,虽然它可以降低这种可能性。在处理大约5000万次操作时,出现了十几个错误,这样的错误率在某些情况下是可以接受...
│ hibernate.cfg.xml │ HibernateDaoImpl.java │ HibernateSessionFactory.java │ HibernateUtil.java │ JsonUtil.java │ list.txt │ log4j.properties │ messageResource_zh_CN.properties │ spring.xml ...
HibernateInterceptor HibernateJdbcException HibernateJdbcException HibernateJpaDialect HibernateJpaVendorAdapter HibernateObjectRetrievalFailureException HibernateObjectRetrievalFailureException...
### Hibernate 3.2 官方用户手册知识点详解 #### 一、概述 Hibernate 是一款开源的对象关系映射 (ORM) 工具,用于 Java 应用程序与数据库交互。它能够将 Java 对象自动持久化到关系型数据库中,从而简化了数据访问...
- **PROPAGATION_NOT_SUPPORTED**:以非事务的方式执行操作,如果当前存在事务,则挂起当前的事务。 - **PROPAGATION_NEVER**:以非事务方式执行,如果当前存在事务,则抛出异常。 - **PROPAGATION_NESTED**:如果...
本文将深入探讨Spring AOP事务管理的核心概念、配置、以及可能遇到的问题和解决方案。 首先,我们需要理解什么是AOP。AOP是一种编程范式,用于将关注点(如日志、安全检查、事务管理)与主要业务逻辑解耦。在Spring...
默认情况下,如果方法抛出未检查异常(继承自RuntimeException的异常)或者TransactionException,Spring会回滚事务;否则,事务会在方法结束时提交。 ```java @Service public class UserService { @...
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException; void commit(TransactionStatus status) throws TransactionException; void rollback(TransactionStatus ...
Spring AOP,全称Aspect Oriented Programming...同时,由于事务管理、安全检查、缓存和对象池管理等都是常见的系统性服务,Spring AOP为这些问题提供了统一的解决方案,使得我们的应用程序更加模块化和易于扩展。
$result[0]) throw new TransactionException(PDO_ERROR_CODE, '更新用户失败', $result); }); echo_msg('注册成功'); //可以直接提交json,用下面方式接收 $newUser = request_object(); //$newUser = ...
protected void onRun() throws TransactionException { // 在这里执行数据库操作 User user = new User().name("Jane").email("jane@example.com"); user.save(); } @Override protected void onFinish...
3. **TransactionException.java** - 这个文件可能定义了一个自定义的异常类,用于在交易过程中捕获和处理错误或异常情况。 4. **i3package-info.java** - 这个文件通常用于提供包级别的注释,可能包含了关于这个包...