Я вызываю несколько хранимых процедур SQLServer 2008 через JDBC.
Я бы хотел, чтобы все эти вызовы proc были частью одной транзакции.
На стороне Java у меня есть эквивалентследующее:
con.setAutoCommit( false );
boolean hasFailed = true;
try
{
... call PROC_1
... call PROC_2
con.commit( );
hasFailed = false;
}
finally
{
if ( hasFailed )
{
con.rollback( );
}
con.setAutoCommit( true );
}
В PROC_1 у меня есть защита транзакций, которая запускает новую транзакцию только в том случае, если транзакция не выполняется.
Защита реализуется путем проверки значения @@TRANCOUNT
declare @owns_transaction int = 0
begin try
if @@TRANCOUNT = 0
begin
begin transaction
set @owns_transaction = 1
end
... do work
if @owns_transaction = 1
begin
commit transaction
set @owns_transaction = 0
end
end try
begin catch
if @owns_transaction = 1
begin
rollback transaction
set @owns_transaction = 0
end
... handle error
end catch
Однако, когда я вхожу в PROC_1, @@ TRANCOUNT по-прежнему равен 0, поэтому он начинает новую транзакцию, и я думаю, что это может иметь некоторые печальные последствия позже.
I 'мы пытались использовать XACT_STATE (), но он также возвращает результат 0, что означает «Нет активной пользовательской транзакции для текущего запроса.», и в соответствии с этим я должен также запустить ручную транзакцию.
Я что-то не так делаю?
Кстати, я думаю, что SQLServer знает, что он находится в транзакции, потому что, если я добавлю имя к оператору transaction
, оно будет прервано в rollback
, что будет связаноНе откат транзакции с таким именем.Это дает мне понять, что транзакция TOP-LEVEL не запускается в PROC_1, но действительно запускается в JDBC.