ITサービスマネージャ 2019年 午前2 問21
問題文
トランザクションT₁、T₂の同時実行制御が適切に行われない場合に起こり得る、レコードX、Yの変更消失問題(lost update anomaly)に該当する処理はどれか。
選択肢
ア:T₁がXとYを参照しながら値の集計を行っている最中に、T₂がXを更新した。
イ:T₁がXを更新した後、コミットする前に、T₂がXを参照したが、T₁がロールバックした。
ウ:T₁がXを追加した後、コミットする前に、T₂がXを参照し、その値を使ってYを更新した。
エ:T₁とT₂がXをほぼ同時に参照し、その値に基づいてXをT₁、T₂の順番に更新した。(正解)
🔒 解説は解答すると表示されます
ロストアップデート【午前2解説】
正解の理由
ロストアップデート(変更消失問題)とは、複数のトランザクションが同じデータを読み取り、それぞれの更新を行った結果、後から書き込まれた値によって先の更新が上書きされてしまう現象です。
エでは、T₁とT₂がどちらも更新前のXを読み取っています。その後、T₁がXを更新し、続いてT₂が先に読み取った古い値を基にXを更新します。このとき、T₁による更新内容がT₂の更新で上書きされ、変更が失われます。
解法ステップ
- ロストアップデートでは、複数のトランザクションが同じデータを読み取る点に注目します。
- その後、両方が同じデータを更新するかを確認します。
- 後から書き込む処理が、先に書き込まれた更新を上書きするなら、ロストアップデートです。
- エは、Xの読み取り後にT₁、T₂の順でXを更新するため、先の更新が後の更新で失われます。
選択肢別の誤答解説
- ア:T₁がXとYを集計している途中で、T₂がXを更新しています。T₁が異なる時点の値を使って集計し、整合しない結果を得る「誤った要約」などに該当します。Xに対する二つの更新が上書きし合う状況ではありません。
- イ:T₁がコミットする前の更新値をT₂が読み取り、その後T₁がロールバックしています。未コミットのデータを読み取る「ダーティリード」です。
- ウ:T₁がコミットする前に追加したXをT₂が読み取り、その値を使ってYを更新しています。未コミットのデータに依存する処理であり、ダーティリードに該当します。
- エ:T₁とT₂が同じ更新前のXを読み、それぞれの更新を順に書き込みます。後から書き込むT₂の更新によってT₁の更新が上書きされるため、ロストアップデートです。
よくある誤解
- 更新が二つあればロストアップデートだと思う
更新が複数あるだけでは不十分です。同じ古い値を基に更新し、先の更新が後の書き込みで失われることがポイントです。 - 未コミットの値を読む現象と混同する
未コミットの値を読むのはダーティリードです。ロストアップデートは、更新同士の上書きによって変更が失われる現象です。 - 書き込みの順番だけに注目する
重要なのは、各トランザクションがどの時点の値を読み取ったかです。古い値を使って後から書き込むことが問題になります。
補足コラム
ロストアップデートを防ぐ代表的な方法は、更新対象のデータをロックすることです。たとえば、T₁がXを読み取って更新する間、T₂がXを同時に更新できないようにします。
また、楽観的排他制御では、更新時に読み取り後のデータが変更されていないかを確認し、変更されていれば更新をやり直します。いずれも、古い値を基にした更新が新しい更新を上書きするのを防ぐ仕組みです。
FAQ
Q. 後から書き込んだ更新は、必ずロストアップデートになりますか?
A. いいえ。後から書き込んだ値が、先の更新を上書きして消してしまう場合に該当します。最新の値を読み直して正しく更新していれば、変更消失は起きません。
A. いいえ。後から書き込んだ値が、先の更新を上書きして消してしまう場合に該当します。最新の値を読み直して正しく更新していれば、変更消失は起きません。
Q. ダーティリードとの違いは何ですか?
A. ダーティリードは、コミット前の値を読み取る現象です。ロストアップデートは、複数の更新が競合し、後の更新によって先の更新が失われる現象です。
A. ダーティリードは、コミット前の値を読み取る現象です。ロストアップデートは、複数の更新が競合し、後の更新によって先の更新が失われる現象です。
関連キーワード: ロストアップデート、ダーティリード、トランザクション、同時実行制御、排他制御

\ せっかくなら /
ITサービスマネージャを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

