2017-10-25 67 views
0

複数の挿入のトランザクションを作成しようとしていますが、いずれかが失敗した場合はすべてをロールバックします。私はこれを持っていることがわかった例に基づいてSQL Server - トランザクションの正しい構文

BEGIN TRY 
BEGIN TRAN 
INSERT1 
INSERT2 
INSERT3 
INSERT4 
COMMIT TRAN 
END TRY 
BEGIN CATCH 
IF (@@TRANCOUNT > 0) 
BEGIN 
    ROLLBACK TRANSACTION; 
END; 
INSERT INTO Errors (errornumber, errorseverity, errorstate, errorprocedure, errorline, errormessage) 
    VALUES (ERROR_NUMBER(), ERROR_SEVERITY(), ERROR_STATE(), ERROR_PROCEDURE(), ERROR_LINE(), ERROR_MESSAGE()) 
END CATCH 

私の例ではINSERT4は失敗します。他のインサートは正しくロールバックされているようですが、このエラーが発生します。

EXECUTEの後のトランザクション数は、BEGINとCOMMIT文の数が一致しないことを示します。前のカウント= 0、現在のカウント= 1

構文は正しいですか? @@ TRANCOUNT>の代わりにIF(XACT_STATE())= -1をテストする他の例を見てきました。

+0

とあなたがストアドプロシージャでトランザクションを持っていますか? –

+0

'ROLLBACK TRANSACTION'の直後に' INSERT INTO Errors'を入れてみてください – gofr1

答えて

-1

ここでは、失敗したとしてもすべての挿入文をロールバックします。

私が最初にテーブルを切り捨て、文字列値をint列に挿入しようとしています。このofcauseは失敗し、ステートメントはロールバックされます。私が最初に切り捨てたとしても、あなたは私のtran1テーブルとtran2テーブルにまだ結果があることがわかります。

BEGIN TRANSACTION; 
BEGIN TRY 

truncate table dbo.tran1; 
truncate table dbo.tran2; 
INSERT INTO dbo.Tran1 
values ('ost') 

INSERT INTO dbo.tran2 
values('gert') 

END TRY 
BEGIN CATCH 
IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION; 
THROW; 
END CATCH; 
IF @@TRANCOUNT > 0 COMMIT TRANSACTION; 

そして、あなたはあなたのエラーでそれをしたい場合は、それがこのようになりますログ:

BEGIN TRANSACTION; 
BEGIN TRY 

truncate table dbo.tran1; 
truncate table dbo.tran2; 


INSERT INTO dbo.tran2 
values('frands') 
INSERT INTO dbo.Tran1 
values ('hans') 


END TRY 
BEGIN CATCH 
IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION; 
INSERT INTO Errors (errornumber, errorseverity, errorstate, errorprocedure, 
errorline, errormessage) 
VALUES (ERROR_NUMBER(), ERROR_SEVERITY(), ERROR_STATE(), ERROR_PROCEDURE(), 
ERROR_LINE(), ERROR_MESSAGE()) 
END CATCH; 
IF @@TRANCOUNT > 0 COMMIT TRANSACTION; 

テーブル

enter image description here enter image description here

結果 enter image description here

結果、エラーログ enter image description here

+0

なぜ理由を述べずにdownvoteしますか?私はそれを得ることはできません..私の答えが悪いのように感じる(誰でも)場合は、なぜ私は改善することができますか教えてください..... – plaidDK

+0

エラーログ処理で更新されました – plaidDK

関連する問題