1

私のSQL-Server学習曲線は前向きで、数年後、TRANSACTIONコードを効果的に使用するために戦っています。

COMMIT TRANSACTION明示的に指定されていない場合、前のコードでエラーが発生しなかった時点で、ROLLBACK TRANSACTIONトランザクションはコミットされますか?問題は、次のような構造に関連しています。

USE MyDataBase;
GO
     BEGIN TRANSACTION;
        --complex query X here  
     ROLLBACK TRANSACTION; PRINT N'Rolled back the transaction.';
GO

...のスクリプトROLLBACK TRANSACTIONでエラーが発生した場合にデータベースに変更を加えたくない状況で使用されたと思いました-上記では、これはです。上記で明示的に述べたい場合は、どこに配置する必要がありますか?XCOMMIT TRANSACTION

さらに混乱させるために、私は次のことを知っています-なぜそれが2回ロールバックするのですか?作成時にエラーが発生していROLLBACKませんか?

USE WHAnalysis;
GO
    BEGIN TRANSACTION;

        IF @@TRANCOUNT = 1
            SELECT @@TRANCOUNT
            --do a complex query here

    ROLLBACK TRANSACTION; PRINT N'Rolled back the transaction.';
GO
4

1 に答える 1

0

いいえ。トランザクションはコミットされるまで開いたままでコミットされないままになります。これにより、最終的にデータベースがブロックされる可能性があります。

トランザクションがネストされている場合、ロールバックは内部トランザクションではなく外部トランザクションの先頭にロールバックします-http ://msdn.microsoft.com/en-us/library/ms181299.aspxを参照してください

私は次のような構造を考えます

 begin try
      begin tran
      -- do query
      commit tran
 end try
 begin catch
      if @@trancount>0 
      begin
          rollback
      end
      -- handle error here
 end catch
于 2012-11-08T10:02:33.103 に答える