ПРИНТ 'Успех', который испортил начало trans / begin try commit / end try? - PullRequest
1 голос
/ 04 марта 2010

Итак, я только что увидел странное поведение

В одном скрипте есть что-то вроде:

  begin transaction
  begin try

       stuff
       stuff
       stuff

       print 'commit'
       commit transaction
  end try
  begin catch
       print 'rollback'
       print error_message()
       rollback transaction
  end catch

Дело в том, что при запуске этого скрипта я вижу сообщение о фиксации печати, но оно не выполняет фиксацию и не блокирует таблицы / строки / и т.д.

Я должен вручную выполнить коммит, выбрав строку и запустив ее.

но если я сделаю это

 begin transaction
  begin try

       stuff
       stuff
       stuff

       commit transaction
       print 'commit'
  end try
  begin catch
       print error_message()
       rollback transaction
       print 'rollback'
  end catch

(поменял местами отпечаток и коммит)

отлично работает.

Кто-нибудь знает, почему это произойдет?

1 Ответ

2 голосов
/ 04 марта 2010

у меня это нормально работает:

--create table t (rowid int)  --create one time before running script

begin transaction
  begin try

       insert into t values (1)
       print 'commit'
       print XACT_STATE()   --should be 1
       commit transaction
       print XACT_STATE()   --should be 0
  end try
  begin catch
       print ERROR_MESSAGE()
       rollback transaction
       print 'rollback'
  end catch

select * from t

выход

commit
1
0
rowid
-----------
1

Закройте окно SSMS, откройте новое окно, а затем снова запустите свой 1-й сценарий. Готов поспорить, у вас была открытая транзакция при первом запуске, поэтому вам потребовался дополнительный COMMIT.

РЕДАКТИРОВАТЬ после комментария OP:

запустить этот точный скрипт в новом соединении с каждой базой данных:

BEGIN TRY create table t (rowid int) END TRY BEGIN CATCH END CATCH

print 'A - XACT_STATE()='+ISNULL(CONVERT(varchar(10),XACT_STATE()),'')+', @@TRANCOUNT='+ISNULL(CONVERT(varchar(10),@@TRANCOUNT),'')

begin transaction
  begin try

       insert into t values (1)
       print 'commit'
       print 'B - XACT_STATE()='+ISNULL(CONVERT(varchar(10),XACT_STATE()),'')+', @@TRANCOUNT='+ISNULL(CONVERT(varchar(10),@@TRANCOUNT),'')
       commit transaction
       print 'C - XACT_STATE()='+ISNULL(CONVERT(varchar(10),XACT_STATE()),'')+', @@TRANCOUNT='+ISNULL(CONVERT(varchar(10),@@TRANCOUNT),'')
  end try
  begin catch
       print ERROR_MESSAGE()
       rollback transaction
       print 'rollback'
  end catch

print 'D - XACT_STATE()='+ISNULL(CONVERT(varchar(10),XACT_STATE()),'')+', @@TRANCOUNT='+ISNULL(CONVERT(varchar(10),@@TRANCOUNT),'')

select * from t

вы должны получить это:

A - XACT_STATE()=0, @@TRANCOUNT=0

(1 row(s) affected)
commit
B - XACT_STATE()=1, @@TRANCOUNT=1
C - XACT_STATE()=0, @@TRANCOUNT=0
D - XACT_STATE()=0, @@TRANCOUNT=0
rowid
-----------
1

(1 row(s) affected)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...