INSERT文,UPDATE文,またはDELETE文によって表が更新される場合,該当する行を各トランザクション固有の領域に格納し,その領域でデータが更新されます。この領域を更新バッファといい,トランザクションごとに確保されます。更新バッファ上でデータが更新されたあとに,トランザクションがコミットされると,更新バッファ上の更新データがDBエリアに反映されます。
表を更新するときの処理方式を次の図に示します。
図2-7 表を更新するときの処理方式
SELECT文で表を参照する場合は,該当する行が自トランザクションの更新バッファ上にあるときは,更新バッファ上のデータを参照します。該当する行が更新バッファ上にないときは,DBエリア上のデータを参照します。
複数のトランザクションが同じ行を更新した場合,あとから更新を行ったトランザクションはエラーとなり,そのトランザクションはロールバックされます。
複数のトランザクションが同じ行を更新するときの例を次の図に示します。
図2-8 複数のトランザクションが同じ行を更新するときの例
XDBは,同時に実行されるトランザクションで同じ行が更新されることがほとんどないようなシステムで使用されることを想定しています。同じ行を同時に更新してエラーとなった場合でも,アプリケーション側でリトライやキャンセルによる対応ができることを前提としています。
トランザクションがコミットされると,更新バッファ上のデータがDBエリアに反映されます。
トランザクションがロールバックされると,更新バッファ上の更新データは消去されて,更新バッファはトランザクション開始前の状態になります。ロールバックしたトランザクションについては,UAP側で処理を再実行できるようにしてください。