トランザクションの開始
OceanBaseデータベースのトランザクション制御文はMySQLデータベースと互換性があり、トランザクションを開始するには以下の方法があります:
START TRANSACTIONコマンドを実行しますBEGINコマンドを実行しますSET autocommit = 0を実行した後に実行される最初のステートメント
構文は以下のとおりです:
START TRANSACTION
[transaction_characteristic [, transaction_characteristic] ...]
transaction_characteristic: {
WITH CONSISTENT SNAPSHOT
| READ WRITE
| READ ONLY
}
BEGIN [WORK]
SET autocommit = {0 | 1}
トランザクションのコミット
トランザクションのコミットは COMMIT コマンドで完了します。具体的な構文は以下のとおりです:
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
さらに、autocommit = 0 の場合、トランザクションを開始するステートメントを実行すると、現在進行中のトランザクションも暗黙的にコミットされます。
トランザクションのロールバック
トランザクションのロールバックは ROLLBACK コマンドで完了します。
トランザクションのロールバックのSQL構文は以下のとおりです:
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
自動コミット
自動コミットとは、autocommit というSession変数の値が 1 の場合、各ステートメントの実行終了後にOceanBaseデータベースがそのトランザクションを自動的にコミットすることを指します。このように、一つのステートメントが一つのトランザクションとなります。
暗黙的コミット
暗黙的コミットとは、ユーザーがCOMMIT/ROLLBACKなどのトランザクション終了ステートメントをOceanBaseデータベースに送信しない場合でも、OceanBaseデータベースが現在アクティブなトランザクションを自動的にCOMMITしてコミットするプロセスを指します。
暗黙的コミットは以下の場合に発生します:
トランザクションを開始するステートメントを実行する場合
DDLを実行する場合
自動ロールバック
自動ロールバックとは、ユーザーがROLLBACK命令を送信せず、OceanBaseデータベース内部で発動されるロールバックを指します。通常、以下の場合に発生します:
セッションが切断された場合
トランザクションの実行がタイムアウトした場合 (ob_trx_timeout)
アクティブなトランザクションのセッションが一定時間ステートメントを実行しなかった場合 (ob_trx_idle_timeout)
説明
ob_trx_timeoutはトランザクションのタイムアウト時間を設定するために使用され、単位はマイクロ秒です。ob_trx_idle_timeoutはトランザクションのアイドルタイムアウト時間を設定するために使用され、トランザクション内の2つのステートメント間の実行間隔がこの値を超えた場合にタイムアウトします。単位はマイクロ秒です。
変数の詳細については、構成パラメータとシステム変数の概要を参照してください。
これらの場合、トランザクションはOceanBaseデータベースによって自動的にロールバックされます。ユーザーが再度現在のセッション(切断されていない)でSQLを実行すると、トランザクションが中断された(継続できない)ためロールバックが必要であるというメッセージが表示されます。この時点で、ユーザーはROLLBACKを実行して現在のトランザクションを終了する必要があります。
トランザクションが中断された場合
トランザクションの実行中に内部エラーが発生した場合、例えば参加者ノードのダウンやその他の理由によりトランザクションが継続できなくなった場合、現在のトランザクションではステートメントを正常に実行できなくなり、ロールバックしか選択肢がありません。
このような状況が発生した場合、ユーザーがSQLステートメントを実行すると、「transaction need rollback」というエラーが返されます。ユーザーはROLLBACKを実行して現在のトランザクションを終了する必要があります。