SQL Server 2005 - не удается откатить вложенную транзакцию

Иногда я получаю следующее от 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

Любые идеи?

Когда механизм пула соединений пытается закрыть подготовленный оператор:

9 ноября 2009 г. 9:32:55 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement close
ПРЕДУПРЕЖДЕНИЕ: 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)
9 ноября 2009 г. 9:32:55 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement close
ПРЕДУПРЕЖДЕНИЕ: SQLServerPreparedStatementID: 186 (ConnectionID: 139 TransactionID: 0x1A00000039000000): ошибка (игнорируется) при закрытии PreparedHandle: 0

Хранимая процедура содержит вложенную транзакцию T1, которая, я считаю, не нужна. Может ли это быть проблема?

Спасибо

9.11.2009 09:40:07
2 ОТВЕТА
РЕШЕНИЕ

Первая ошибка связана с тем, что у вас есть именованная вложенная транзакция, к которой вы пытаетесь выполнить откат - именование вложенной транзакции (именование означает, что вы должны напечатать что-то вроде «BEGIN TRANSACTION», что в вашем случае = T1), но переход возврат к именованной вложенной транзакции не поддерживается и приводит к ошибке.

Смотрите эту тему для получения дополнительной информации.

1
9.11.2009 20:53:57

Если вам необходимо откатить вложенную транзакцию, вы можете использовать SAVE Transaction. смотрите здесь

1
22.08.2012 10:17:47