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