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