SQL Server 2005 - 无法回滚嵌套事务
Posted
技术标签:
【中文标题】SQL Server 2005 - 无法回滚嵌套事务【英文标题】:SQL Server 2005 - Cannot rollback nested transaction 【发布时间】:2009-11-09 09:40:07 【问题描述】:执行存储过程时,有时我会从 SQL Server 2005 获得以下信息:
原因:com.microsoft.sqlserver.jdbc.SQLServerException:无法回滚 T1。未找到该名称的事务或保存点。 在 com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(未知来源) 在 com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(未知来源) 在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(未知来源) 在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(未知来源) 在 com.microsoft.sqlserver.jdbc.TDSCommand.execute(未知来源) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(未知来源) 在 com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(未知来源) 在 com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(未知来源) 在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeUpdate(未知来源) 在 com.mchange.v2.c3p0.impl.NewProxyCallableStatement.executeUpdate(NewProxyCallableStatement.java:2160) 在 com.sm.persistence.dao.TransactionRejectDAO.callSpMoveTransaction(TransactionRejectDAO.java:631) ... 6 更多有什么想法吗?
当连接池机制试图关闭准备好的语句时:
2009 年 11 月 9 日上午 9:32:55 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement 关闭 警告:SQLServerPreparedStatementID:201(ConnectionID:139 TransactionID:0x1A00000039000000):错误(忽略)关闭 PreparedHandle:0 com.microsoft.sqlserver.jdbc.SQLServerException:服务器无法恢复事务。描述:390000001a。 在 com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(未知来源) 在 com.microsoft.sqlserver.jdbc.TDSTokenHandler.onEOF(未知来源) 在 com.microsoft.sqlserver.jdbc.TDSParser.parse(未知来源) 在 com.microsoft.sqlserver.jdbc.TDSParser.parse(未知来源) 在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$1PreparedHandleClose.doExecute(未知来源) 在 com.microsoft.sqlserver.jdbc.TDSCommand.execute(未知来源) 在 com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(未知来源) 在 com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(未知来源) 在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.closePreparedHandle(未知来源) 在 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.close(未知来源) 在 com.mchange.v1.db.sql.StatementUtils.attemptClose(StatementUtils.java:41) 在 com.mchange.v2.c3p0.stmt.GooGooStatementCache.synchronousDestroyStatement(GooGooStatementCache.java:413) 在 com.mchange.v2.c3p0.stmt.GooGooStatementCache.closeAll(GooGooStatementCache.java:351) 在 com.mchange.v2.c3p0.impl.NewPooledConnection.closeAllCachedStatements(NewPooledConnection.java:673) 在 com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:543) 在 com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:234) 在 com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.destroyResource(C3P0PooledConnectionPool.java:470) 在 com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask.run(BasicResourcePool.java:964) 在 com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547) 2009 年 11 月 9 日上午 9:32:55 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement 关闭 警告:SQLServerPreparedStatementID:186(ConnectionID:139 TransactionID:0x1A00000039000000):错误(忽略)关闭 PreparedHandle:0存储过程包含一个嵌套事务 T1,我认为这是不必要的。会不会是这个问题?
谢谢
【问题讨论】:
【参考方案1】:第一个错误是由于您有一个 named 嵌套事务,您试图回滚到该事务 - 命名一个嵌套事务(命名意味着键入类似“BEGIN TRANSACTION”的内容,在您的 case = T1) 是允许的,但不支持回滚到命名的嵌套事务并导致错误。
有关详细信息,请参阅this 主题。
【讨论】:
【参考方案2】:如果你必须回滚嵌套事务,你可以使用 SAVE Transaction。 见here
【讨论】:
以上是关于SQL Server 2005 - 无法回滚嵌套事务的主要内容,如果未能解决你的问题,请参考以下文章
如何在SQL Server 2005中回滚UPDATE查询?
SQL Server 2005 嵌套视图 - 解除纠缠的策略? [关闭]