Есть ли способ определить, действует ли транзакция JDBC? - PullRequest
0 голосов
/ 21 апреля 2011

Я вызываю несколько хранимых процедур 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.

1 Ответ

1 голос
/ 22 апреля 2011

нашел способ.

Оказывается, когда вы звоните

con.setAutoCommit(false)

эквивалентно установке опции IMPLICIT_TRANSACTIONS для соединения, как это

SET IMPLICIT_TRANSACTIONS ON;

Затем вы можете проверить статус неявной транзакции с помощью функции @@ OPTIONS:

if ((@@OPTIONS & 2) != 2) and (@@TRANCOUNT = 0)
begin
    select 'No transaction'
end
else begin
    select 'Already in transaction'
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...