トランザクション処理機能により、複数のユーザーが同時にデータベース上で作業できるようになり、各ユーザーが一貫したデータバージョンを確認できるようになり、すべての変更が正しい順序で適用されることを保証します。
適用対象
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity EditionはMySQLモードのみを提供しています。
トランザクションとは、1つまたは複数のSQLステートメントのシーケンスであり、OceanBaseデータベースではこれを単一の単位として扱います。つまり、すべてのステートメントを実行するか、実行しないかのどちらかです。
OceanBaseデータベースはデータ構造を自動的にロックするため、異なるユーザーが同一のデータ構造に書き込んでも互いのデータが損なわれることはありません。データの可用性を最大限に高めるために、OceanBaseデータベースは最小限のデータを最短時間でロックします。
OceanBaseデータベースでは、複数のユーザーが同時にデータにアクセスする問題を防ぐために追加コードを記述でき、OceanBaseデータベースのデフォルトのロックメカニズムを手動でオーバーライドすることもできます。
PLがサポートするトランザクション処理および制御のステートメントは以下のとおりです:
COMMITステートメント現在のトランザクションを終了し、その変更を永続的に有効にし、他のユーザーに可視化します。
ROLLBACKステートメント現在のトランザクションを終了し、そのトランザクション内で行われたすべての変更を取り消します。誤ってテーブルから誤った行を削除した場合など、操作ミスが発生した場合、
ROLLBACKは元のデータを復元します。SQLステートメントの実行失敗やPLによる例外発生によりトランザクションが完了できない場合、ROLLBACKは再開するための是正措置を提供します。SAVEPOINTステートメントトランザクション処理内で現在のポイントを命名してマークするために使用されます。セーブポイントを使用すると、トランザクション全体ではなく、トランザクションの一部をロールバックできます。各セッションのアクティブなセーブポイント数に制限はありません。セーブポイントまでロールバックすると、そのセーブポイント以降にマークされたすべてのセーブポイントが削除されます。単純なロールバックまたはコミットはすべてのセーブポイントを削除します。
セーブポイント名は宣言されていない識別子です。トランザクション内でセーブポイント名を再利用すると、セーブポイントは古い位置からトランザクション内の現在の位置に移動します。
SET TRANSACTIONステートメント読み取り専用または読み書きトランザクションを開始し、分離レベルを設定するか、現在のトランザクションを指定されたロールバックセグメントに割り当てるために使用されます。
読み取り専用トランザクションは、複数のユーザーが同一のテーブルを更新し、複数のクエリを実行するシナリオに役立ちます。読み取り専用トランザクション中は、すべてのクエリがデータベースの同一スナップショットを参照するため、複数のテーブル、複数のクエリ、読み取りの一貫性したビューが提供されます。他のユーザーは通常通りクエリやデータの更新を続けることができます。コミットまたはロールバックによりトランザクションが終了します。
SET TRANSACTIONステートメントは、読み取り専用トランザクション内で最初のSQLステートメントでなければならず、トランザクション内で一度しか出現できません。トランザクションをREAD ONLYに設定すると、後続のクエリはトランザクション開始前にコミットされた変更のみを参照し、他のユーザーやトランザクションに影響を与えません。読み取り専用トランザクションでは、
SELECT、OPEN、FETCH、CLOSE、LOCK TABLE、COMMIT、ROLLBACKステートメントのみを使用できます。クエリではFOR UPDATEを使用できません。
さらに、INSERT、UPDATE、DELETE、または MERGE ステートメントを実行する前に、データベースは暗黙のセーブポイント(利用不可)をマークします。このステートメントが失敗した場合、データベースはセーブポイントまでロールバックします。通常、失敗したSQLステートメントのみがロールバックされ、トランザクション全体はロールバックされません。このステートメントが未処理の例外を発生させた場合、ホスト環境がロールバックする内容を決定します。データベースはまた、デッドロックを解除するために個々のSQLステートメントをロールバックすることもできます。データベースはトランザクションに参加するプログラムにエラーシグナルを送信し、そのトランザクション内の現在のステートメントをロールバックします。SQLステートメントを実行する前に、データベースによる解析、つまり文法規則に従い、有効なSchemaオブジェクトを参照していることをチェックして保証する必要があります。SQLステートメントの実行時に検出されたエラーはロールバックを引き起こしますが、そのステートメントの解析時に検出されたエラーはそうではありません。未処理の例外を含むストレージサブルーチンを終了すると、PLは OUT パラメータに値を代入せず、ロールバックも行いません。