sql >> データベース >  >> RDS >> Sqlserver

TSQLはトランザクション内で試行/キャッチしますか、またはその逆ですか?

    TRY内にいるときにのみトランザクションを開きます ブロックして実際のステートメントの直前に置き、すぐにコミットします。コントロールがバッチの最後に移動してトランザクションをコミットするのを待たないでください。

    TRYで問題が発生した場合 ブロックしてトランザクションを開くと、コントロールはCATCHにジャンプします ブロック。そこでトランザクションをロールバックし、必要に応じて他のエラー処理を実行します。

    @@TRANCOUNTを使用して開いているトランザクションのチェックを少し追加しました 実際にトランザクションをロールバックする前に機能します。このシナリオでは、あまり意味がありません。 TRYで検証チェックを行う場合に便利です。 パラメータ値やその他のものをチェックし、TRYでエラーを発生させるなど、トランザクションを開く前にブロックします 検証チェックのいずれかが失敗した場合はブロックします。その場合、コントロールはCATCHにジャンプします トランザクションを開かずにブロックします。そこで、開いているトランザクションを確認し、開いているトランザクションがある場合はロールバックできます。あなたの場合、CATCHを入力しないので、開いているトランザクションをチェックする必要はありません。 トランザクション内で問題が発生しない限り、ブロックします。

    DELETEを実行した後に質問しないでください コミットまたはロールバックする必要があるかどうかの操作。トランザクションを開く前に、これらすべての検証を行ってください。トランザクションが開かれたら、すぐにコミットし、エラーが発生した場合は、エラー処理を実行します(ほとんどすべてのエラー関数を使用して詳細情報を取得することで、適切な作業を行っています)。

    BEGIN TRY
    
      BEGIN TRANSACTION SCHEDULEDELETE
        DELETE   -- delete commands full SQL cut out
        DELETE   -- delete commands full SQL cut out
        DELETE   -- delete commands full SQL cut out
     COMMIT TRANSACTION SCHEDULEDELETE
        PRINT 'X rows deleted. Operation Successful Tara.' --calculation cut out.
    END TRY
    
    BEGIN CATCH 
      IF (@@TRANCOUNT > 0)
       BEGIN
          ROLLBACK TRANSACTION SCHEDULEDELETE
          PRINT 'Error detected, all changes reversed'
       END 
        SELECT
            ERROR_NUMBER() AS ErrorNumber,
            ERROR_SEVERITY() AS ErrorSeverity,
            ERROR_STATE() AS ErrorState,
            ERROR_PROCEDURE() AS ErrorProcedure,
            ERROR_LINE() AS ErrorLine,
            ERROR_MESSAGE() AS ErrorMessage
    END CATCH
    


    1. @@ IDENTITYを使用して、SQLServerで最後に挿入されたID値を返します

    2. MySQLの不正な日時値: '0000-00-00 00:00:00'

    3. PostgreSQLでの数値フォーマット用のテンプレートパターンと修飾子

    4. RedHat8にSQLServerをインストールする方法