2.4.1 データベースの更新処理方式

INSERT文,UPDATE文,またはDELETE文によって表が更新される場合,該当する行を各トランザクション固有の領域に格納し,その領域でデータが更新されます。この領域を更新バッファといい,トランザクションごとに確保されます。更新バッファ上でデータが更新されたあとに,トランザクションがコミットされると,更新バッファ上の更新データがDBエリアに反映されます。

<この項の構成>
(1) 表を更新するときの処理方式
(2) 複数のトランザクションが同じ行を更新する場合(エラーとなるケース)
(3) トランザクションのコミットとロールバック

(1) 表を更新するときの処理方式

表を更新するときの処理方式を次の図に示します。

図2-7 表を更新するときの処理方式

[図データ]

説明
  1. 更新対象の行が更新バッファ上に読み込まれます。更新バッファはトランザクションごとに確保されます。
  2. 更新バッファ上のデータが更新されます。このとき,DBエリア上のデータは更新されません。更新バッファ上でデータの更新を行っている間(トランザクションがコミットするまでの間),DBエリア上の更新対象行をほかのトランザクションから参照できます。
  3. トランザクションのコミット時に,更新バッファ上のデータがDBエリアに反映されます。

SELECT文で表を参照する場合は,該当する行が自トランザクションの更新バッファ上にあるときは,更新バッファ上のデータを参照します。該当する行が更新バッファ上にないときは,DBエリア上のデータを参照します。

(2) 複数のトランザクションが同じ行を更新する場合(エラーとなるケース)

複数のトランザクションが同じ行を更新した場合,あとから更新を行ったトランザクションはエラーとなり,そのトランザクションはロールバックされます。

複数のトランザクションが同じ行を更新するときの例を次の図に示します。

図2-8 複数のトランザクションが同じ行を更新するときの例

[図データ]

説明
あとから更新しようとしたトランザクション2はエラーになります。このとき,トランザクション2はロールバックします。

XDBは,同時に実行されるトランザクションで同じ行が更新されることがほとんどないようなシステムで使用されることを想定しています。同じ行を同時に更新してエラーとなった場合でも,アプリケーション側でリトライやキャンセルによる対応ができることを前提としています。

(3) トランザクションのコミットとロールバック

トランザクションがコミットされると,更新バッファ上のデータがDBエリアに反映されます。

トランザクションがロールバックされると,更新バッファ上の更新データは消去されて,更新バッファはトランザクション開始前の状態になります。ロールバックしたトランザクションについては,UAP側で処理を再実行できるようにしてください。