OceanBaseデータベースはステートメントレベルの原子性をサポートしています。ステートメントレベルの原子性とは、あるステートメントの操作がすべて成功するか、すべて失敗するかのどちらかであり、部分的に成功し部分的に失敗することはないということです。
あるステートメントの実行中にエラーが発生しない場合、そのステートメントによる変更はすべて成功したことになります。一方、ステートメントの実行中にエラーが発生した場合、そのステートメントで行われた操作はすべてロールバックされます。このような状況をステートメントレベルのロールバックと呼びます。ステートメントレベルのロールバックには以下の特徴があります:
ステートメントがロールバックされる際は、そのステートメント自身の変更のみがロールバックされ、現在のトランザクションにおけるそのステートメント以前のステートメントによる変更には影響しません。
例えば、あるトランザクションに2つの
UPDATEステートメントがある場合、最初のUPDATEステートメントが成功し、2番目のUPDATEステートメントが失敗した場合、ロールバックされるのは2番目のUPDATEステートメントのみであり、最初のUPDATEステートメントによる変更は保持されます。ステートメントレベルのロールバックの効果は、そのステートメントが実行されなかったことと同等です。つまり、ステートメントの実行中に関与したグローバルインデックス、トリガー、行ロックなどはすべてそのステートメントの操作に属し、ステートメントのロールバックにはこれらの操作をすべてステートメント開始前の状態に戻す必要があります。
一般的なステートメントレベルのロールバックのケースは以下の通りです:
INSERT操作で主キー競合が発生した場合、ステートメントレベルのロールバックが発生します。
単一のステートメントの実行時間が長すぎて、ステートメントの実行タイムアウトが発生した場合、ステートメントレベルのロールバックが発生する可能性があります。
複数のトランザクション間で行ロック競合が発生し、デッドロックに陥った場合、デッドロック検出メカニズムによって特定のトランザクションがキルされた場合、ステートメントレベルのロールバックが発生する可能性があります。
SQLステートメントの構文解析エラーはステートメントレベルのロールバックには該当しません。これは、構文解析エラーではまだデータに変更が加えられていないためです。