トランザクション処理機能により、複数のユーザーが同時にデータベースで作業できるようになり、各ユーザーが一貫したデータバージョンを確認できること、およびすべての変更が正しい順序で適用されることが保証されます。
機能の適用範囲
この内容は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ステートメントでなければならず、トランザクション内で1回しか使用できません。トランザクションをREAD ONLYに設定すると、後続のクエリはトランザクション開始前にコミットされた変更のみを参照し、他のユーザーやトランザクションに影響を与えません。読み取り専用トランザクションでは、
SELECT、OPEN、FETCH、CLOSE、LOCK TABLE、COMMIT、ROLLBACKステートメントのみの使用が許可されています。クエリではFOR UPDATEを使用できません。
さらに、INSERT、UPDATE、DELETE、MERGE ステートメントを実行する前に、データベースは暗黙のセーブポイント(使用不可)を設定します。該当ステートメントが失敗した場合、データベースはこのセーブポイントまでロールバックします。通常、失敗したSQLステートメントのみがロールバックされ、トランザクション全体はロールバックされません。ステートメントが未処理の例外を発生させた場合は、ホスト環境がロールバックする内容を決定します。データベースはまた、デッドロックを解消するために個々のSQLステートメントをロールバックすることもできます。データベースは関与するトランザクションにエラーシグナルを送信し、そのトランザクション内の現在のステートメントをロールバックします。SQLステートメントを実行する前に、データベースによる解析、つまり構文規則のチェックと有効なSchemaオブジェクトへの参照が必要です。SQLステートメントの実行時に検出されたエラーはロールバックを引き起こしますが、そのステートメントの解析時に検出されたエラーは引き起こしません。未処理の例外を含むストアサブルーチンを終了すると、PLは OUT パラメータに値を代入せず、ロールバックも行いません。