トランザクションの開始
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 の場合、トランザクションを開始するステートメントを1つ実行するだけで、現在進行中のトランザクションが暗黙的にコミットされます。
トランザクションのロールバック
トランザクションのロールバックは ROLLBACK コマンドで行います。
トランザクションのロールバックSQL構文は以下のとおりです:
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
自動コミット
自動コミットとは、autocommit というセッション変数の値が 1 の場合、OceanBaseデータベースが各ステートメントの実行後に、そのステートメントを含むトランザクションを自動的にコミットすることを指します。このように、1つのステートメントが1つのトランザクションとなります。
暗黙的コミット
暗黙的コミットとは、ユーザーがOceanBaseデータベースに対してCOMMIT/ROLLBACKなどのトランザクション終了ステートメントを発行しない場合でも、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を実行して現在のトランザクションを終了する必要があります。