org.hibernate.TransactionException: JDBC rollback failed 处理

解决Hibernate TransactionException
本文解决了一个常见的Hibernate问题:TransactionException,具体表现为JDBC回滚失败。该问题是由于查询过程中不当使用了rollback操作导致的,解决方案为移除不必要的rollback。

org.hibernate.TransactionException: JDBC rollback failed

org.hibernate.transaction.JDBCTransaction.rollback(JDBCTransaction.java:170)

 

由于查询的时候使用了 rollback 。把rollback取消即可解决。

在事务处理中,模板方法模式被广泛应用于统一事务的处理流程,同时允许不同的数据库访问技术实现自己的事务逻辑。Spring框架通过 `PlatformTransactionManager` 接口和 `AbstractPlatformTransactionManager` 抽象类实现了这一模式[^1]。 ### 事务处理模板的实现方式 `AbstractPlatformTransactionManager` 是事务处理的核心抽象类,它定义了事务的创建、提交和回滚的模板方法。该类封装了事务的基本流程,并通过 `getTransaction()` 方法获取事务状态对象 `TransactionStatus`,从而实现事务的统一管理[^1]。 ```java public abstract class AbstractPlatformTransactionManager implements PlatformTransactionManager { // 获取事务 public final TransactionStatus getTransaction(TransactionDefinition definition) { // 创建事务 Object transaction = doGetTransaction(); // 检查是否已有事务 if (isExistingTransaction(transaction)) { // 处理已存在的事务 return handleExistingTransaction(definition, transaction); } // 创建新事务 return startTransaction(definition, transaction); } // 提交事务 public final void commit(TransactionStatus status) { // 提交事务的具体实现 doCommit(status); } // 回滚事务 public final void rollback(TransactionStatus status) { // 回滚事务的具体实现 doRollback(status); } // 由子类实现的具体操作 protected abstract Object doGetTransaction(); protected abstract boolean isExistingTransaction(Object transaction); protected abstract TransactionStatus handleExistingTransaction(TransactionDefinition definition, Object transaction); protected abstract TransactionStatus startTransaction(TransactionDefinition definition, Object transaction); protected abstract void doCommit(TransactionStatus status); protected abstract void doRollback(TransactionStatus status); } ``` ### 事务处理的实现方法 不同的数据库访问技术(如 JDBCHibernate、MyBatis)需要实现 `AbstractPlatformTransactionManager` 的抽象方法,以支持特定的事务管理。例如,在整合 MyBatis 时,`DataSourceTransactionManager` 继承了 `AbstractPlatformTransactionManager`,并提供了与 JDBC 事务相关的具体实现[^2]。 ```java public class DataSourceTransactionManager extends AbstractPlatformTransactionManager { private DataSource dataSource; public DataSourceTransactionManager(DataSource dataSource) { this.dataSource = dataSource; } @Override protected Object doGetTransaction() { // 获取数据库连接 Connection connection = dataSource.getConnection(); return new DataSourceTransactionObject(connection); } @Override protected boolean isExistingTransaction(Object transaction) { DataSourceTransactionObject txObject = (DataSourceTransactionObject) transaction; return txObject.getConnection().getAutoCommit() == false; } @Override protected TransactionStatus handleExistingTransaction(TransactionDefinition definition, Object transaction) { // 处理已存在的事务逻辑 return new SimpleTransactionStatus(); } @Override protected TransactionStatus startTransaction(TransactionDefinition definition, Object transaction) { DataSourceTransactionObject txObject = (DataSourceTransactionObject) transaction; try { txObject.getConnection().setAutoCommit(false); } catch (SQLException e) { throw new TransactionException("Failed to start transaction", e); } return new SimpleTransactionStatus(); } @Override protected void doCommit(TransactionStatus status) { DataSourceTransactionObject txObject = (DataSourceTransactionObject) status.getTransaction(); try { txObject.getConnection().commit(); } catch (SQLException e) { throw new TransactionException("Failed to commit transaction", e); } } @Override protected void doRollback(TransactionStatus status) { DataSourceTransactionObject txObject = (DataSourceTransactionObject) status.getTransaction(); try { txObject.getConnection().rollback(); } catch (SQLException e) { throw new TransactionException("Failed to rollback transaction", e); } } private static class DataSourceTransactionObject { private final Connection connection; public DataSourceTransactionObject(Connection connection) { this.connection = connection; } public Connection getConnection() { return connection; } } } ``` ### 事务处理模板的优势 模板方法模式在事务处理中的应用带来了以下优势: - **统一算法结构**:事务的创建、提交和回滚流程由 `AbstractPlatformTransactionManager` 统一定义,确保所有子类遵循相同的事务管理逻辑[^4]。 - **灵活性与可扩展性**:具体的事务操作(如获取连接、提交事务)由子类实现,允许不同数据库访问技术提供自己的实现。 - **代码复用**:模板方法减少了重复代码,提高了事务处理的可维护性[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值