トランザクション処理機能により、複数のユーザーが同時にデータベースで作業できるようになり、各ユーザーが一貫したデータバージョンを確認できること、およびすべての変更が正しい順序で適用されることが保証されます。
適用対象
この内容は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ステートメントを実行する前に、データベースによる解析、つまり構文規則のチェックと有効なスキーマオブジェクトへの参照の確認が必要です。SQLステートメントの実行時に検出されたエラーはロールバックを引き起こしますが、そのステートメントの解析時に検出されたエラーは引き起こしません。未処理の例外を含むストアサブルーチンから終了すると、PLはOUTパラメータに値を代入せず、ロールバックも行いません。