Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL の使用法 » ストアド・プロシージャとトリガ » プロシージャ、トリガ、バッチの使用 » 制御文

 

アトミックな複合文

「アトミック」な文とは、完全に実行されるか、まったく実行されない文のことです。たとえば、何千ものローを更新する UPDATE 文では、たくさんのローを更新した後にエラーが発生することがあります。文が完了しないと、変更されたすべてのローが元の状態に戻ります。したがって、UPDATE 文はアトミックです。

複合文でないすべての SQL 文はアトミックです。BEGIN キーワードの後にキーワード ATOMIC を追加して、複合文をアトミックにすることができます。

BEGIN ATOMIC
   UPDATE Employees
   SET ManagerID = 501
   WHERE EmployeeID = 467;
    UPDATE Employees
   SET BirthDate = 'bad_data';
END

この例の 2 つの UPDATE 文は、アトミックな複合文の一部です。これら 2 つの文は、1 つの文として更新を完了するか、両方ともエラーになります。最初の UPDATE 文はエラーなしで完了するとします。次の UPDATE 文は BirthDate カラムに割り当てた値を日付に変換できないため、エラーになります。

このアトミックな複合文はエラーになり、UPDATE 文の結果は両方とも取り消されます。現在実行中のトランザクションがコミットされても、この複合文中の文は両方ともその効果をもたらしません。

アトミックな複合文が成功すると、現在実行中のトランザクションがコミットされた場合のみ、複合文中で実行された変更は有効になります。アトミックな複合文が成功しても、その文で発生したトランザクションがロールバックされた場合は、アトミックな複合文もロールバックされます。アトミックな複合文の開始時に、セーブポイントが設定されます。文でエラーが発生すると、そのセーブポイントにロールバックされます。

アトミックな複合文がオートコミット (非連鎖) モードで実行されると、文の実行が完了するまでコミット・モードが手動 (連鎖) に変更されます。手動モードでは、アトミックな複文内で DML 文を実行しても、即座に COMMIT や ROLLBACK は実行されません。アトミックな複合文が正常に完了すると、COMMIT 文が実行されます。正常に完了しない場合は ROLLBACK 文が実行されます。オートコミット動作の詳細については、オートコミットまたは手動コミット・モードの設定オートコミットの動作を制御するを参照してください。

COMMIT 文と ROLLBACK 文、および一部の ROLLBACK TO SAVEPOINT 文は、アトミックな複合文内で使用できません。プロシージャとトリガでのトランザクションとセーブポイントを参照してください。

アトミックな複合文内の一部の文しか実行されない場合もあります。複合文の中で例外ハンドラがエラーを処理するときに、このようなことが起こります。

詳細については、プロシージャとトリガでの例外ハンドラの使用を参照してください。