基本情報技術者 2011年 春期 午後 問03
データベースのトランザクション管理に関する次の記述を読んで、設問1〜4に答えよ。
個人向けに、画材をインターネット販売する会社が運営するWebサイトがある。
このWebサイトが在庫管理に利用しているデータベースでは、絵の具の在庫数は色別に個々のデータとして管理されており、処理に応じて次の3種類のトランザクションが生成される。
① 1回の商品注文に対して、一つの出荷トランザクションが生成される。
② 1回の商品入荷に対して、一つの入荷トランザクションが生成される。
③ 1回の在庫照会に対して、一つの照会トランザクションが生成される。
なお、一つのトランザクションで、複数の色の絵の具を処理することができる。
設問1:
問題文を見る ACID特性に関する次の記述中のに入れる正しい答えを、解答群の中から選べ。
ACID特性とは、データベースの一貫性を保証するために必要な特性で、原子性、一貫性、独立性、耐久性の四つがある。このうち、一貫性や独立性を保証するためにトランザクション管理では排他制御が必要となる。例えば、白絵の具の在庫数が50だった場合、表1に示すトランザクションT1とT2が同時に実行されたとき、排他制御を行わないと実行後の在庫数は55とならず、在庫数がa又はbとなってしまう可能性がある。
なお、各トランザクションは、図1の①〜③の順で在庫数データを処理する。


解答群
ア:40
イ:45
ウ:50
エ:60
オ:65
模範解答
a:イ、b:エ(順不同)
解説
解答の導き方
問題では、白絵の具の在庫数が50で、出荷トランザクションT1は5本減らし、入荷トランザクションT2は10本増やします。両方の処理が正しく反映されれば、在庫数は になります。
本文には、各トランザクションが「図1の①〜③の順」で在庫数を読み込み、計算し、書き込むとあります。排他制御がないと、T1とT2がどちらも在庫数50を読み込んでから、それぞれ計算することがあります。
在庫数が45になる場合は、次の順で処理されます。
- T1とT2が、どちらも在庫数50を読み込みます。
- T2は読み込んだ50に10を足して、60を書き込みます。
- T1は読み込んだ50から5を引いて、45を書き込みます。
最後にT1が書き込むため、在庫数は45になります。T2が増やした10本分が、T1の書き込みによって上書きされてしまいます。
在庫数が60になる場合は、書き込みの順が逆になります。
- T1とT2が、どちらも在庫数50を読み込みます。
- T1は読み込んだ50から5を引いて、45を書き込みます。
- T2は読み込んだ50に10を足して、60を書き込みます。
最後にT2が書き込むため、在庫数は60になります。今度はT1が減らした5本分が、T2の書き込みによって上書きされます。
このように、読み込みから書き込みまでの間に別のトランザクションが割り込むと、一方の更新が失われることがあります。これを防ぐために使うのが排他制御です。データをロックして一方の処理を先に完了させれば、後から処理するトランザクションは、更新後の在庫数を読み込めます。
ACID特性は、トランザクションに求められる4つの性質です。Atomicity(原子性)は処理を全て実行するか全く実行しないこと、Consistency(一貫性)は決められたデータの正しさを保つこと、Isolation(独立性)は同時に動く処理が互いの途中経過に影響しないこと、Durability(耐久性)は確定した結果が失われないことです。この問題で特に関係するのは、同時に動く処理の影響を防ぐ独立性です。
誤りやすいポイント
- 出荷の5本と入荷の10本を単純に計算して、55だけが答えだと考えることがあります。55は両方の更新が正しく反映された場合の値です。
- T1とT2がそれぞれ計算した値は、読み込んだ在庫数を基にしています。別のトランザクションが書き込んだ最新の値を、自動的に使うわけではありません。
- 45になる場合と60になる場合は、最後に書き込むトランザクションが異なります。どちらも処理の順序は、各トランザクション内で読み込み、計算、書き込みの順です。
- この問題で問われているのは、処理後の在庫数です。ACID特性の4つの用語の説明だけで終わらないようにしましょう。
FAQ
Q: なぜ在庫数が55ではなく、45や60になるのですか?
A: T1とT2がどちらも更新前の50を読み込むことがあるからです。後から書き込む値が先の書き込みを上書きし、片方の更新が反映されなくなります。
A: T1とT2がどちらも更新前の50を読み込むことがあるからです。後から書き込む値が先の書き込みを上書きし、片方の更新が反映されなくなります。
Q: 排他制御をすると、必ずT1を先に実行するのですか?
A: いいえ。T1とT2のどちらを先に実行しても、片方の処理が完了してからもう一方が更新後の在庫数を読み込めば、両方の更新が反映されます。
A: いいえ。T1とT2のどちらを先に実行しても、片方の処理が完了してからもう一方が更新後の在庫数を読み込めば、両方の更新が反映されます。
Q: この例で中心となるACID特性は何ですか?
A: 同時に動くトランザクションが互いの途中経過に影響しないようにする、独立性です。排他制御は、その性質を保つために使われます。
A: 同時に動くトランザクションが互いの途中経過に影響しないようにする、独立性です。排他制御は、その性質を保つために使われます。
関連キーワード: ACID特性、トランザクション、排他制御、ロック、更新消失
設問2:
問題文を見る 入荷トランザクション及び出荷トランザクションを処理する場合は対象データを占有ロックし、照会トランザクションを処理する場合は共有ロックする。
なお、このデータベースを管理するDBMSでは、あるトランザクションが共有ロックしているデータを、ほかのトランザクションからロックする場合、共有ロックの要求は成功するが、占有ロックの要求は共有ロックが解除されるまで待ち状態となる。
表2に示すトランザクションT3〜T6を、図2に示すとおりに実行し、ロックを要求した場合、それぞれのトランザクションの状態について正しい説明を、解答群の中から選べ。

解答群
ア:T4, T5, T6とも待ち状態となる。
イ:T4, T5, T6とも待ち状態とならない。
ウ:T4, T5は待ち状態となるが、T6は待ち状態とならない。
エ:T4は待ち状態となるが、T5, T6は待ち状態とならない。
オ:T6は待ち状態となるが、T4, T5は待ち状態とならない。模範解答
ウ
解説
解答の導き方
この問題では、各トランザクションが白絵の具の在庫数データにロックを要求したとき、待ち状態になるかを考えます。トランザクションは、データベース上でひとまとまりとして処理する単位です。
まず、処理内容から必要なロックの種類を確認します。問題文には、照会トランザクションは「共有ロック」、入荷トランザクションと出荷トランザクションは「占有ロック」を使うとあります。共有ロックはデータの照会に使い、ほかの共有ロックとは同時に取得できます。占有ロックはデータを更新するときに使います。この問題では、共有ロック中のデータに占有ロックを要求すると、共有ロックが解除されるまで待ちます。
表2と図2から、各トランザクションのロックの種類と、ロック要求の順序を整理します。
図2では、実行開始の順序とロック要求の順序が同じとは限りません。ロック要求は、T3、T6、T4、T5の順です。待ち状態になるかどうかは、実行開始の順ではなく、ロックを要求した時点で既にどのロックが取得されているかで判断します。
- T3は最初に共有ロックを要求します。ほかにロックしているトランザクションがいないので、取得できます。
- 次にT6も共有ロックを要求します。この時点ではT3が共有ロック中ですが、共有ロックの要求は成功するため、T6も取得できます。したがって、T6は待ち状態になりません。
- その次にT4が占有ロックを要求します。T3とT6が共有ロック中なので、T4は共有ロックが解除されるまで待ち状態になります。
- 最後にT5も占有ロックを要求します。この時点でもT3とT6の共有ロックが解除されていないため、T5も待ち状態になります。
なお、T4はT6より先に実行を開始していますが、T6のロック要求はT4のロック要求より先です。そのため、T4の実行開始だけを見て、T6が待ち状態になると判断しないことが大切です。
したがって、T4とT5は待ち状態となり、T6は待ち状態とならないので、該当する選択肢はウです。
誤りやすいポイント
-
実行開始の順序とロック要求の順序を混同する
T4はT6より先に実行を開始しますが、ロック要求はT6のほうが先です。ロックの取得可否は、ロック要求の順序で判断します。 -
共有ロック中は、すべてのロック要求が待ちになると思い込む
この問題では、共有ロック中でも別の共有ロック要求は成功します。待ちになるのは、共有ロック中に占有ロックを要求した場合です。 -
占有ロックを要求するのはT4だけだと考える
T5も出荷トランザクションなので占有ロックを要求します。T5の要求時にも共有ロックが残っているため、T5も待ち状態になります。
FAQ
-
Q: T4が先に実行を開始しているのに、なぜT6は待ち状態にならないのですか?
A: T4は実行を開始した時点では、まだロックを要求していません。T6の共有ロック要求がT4の占有ロック要求より先なので、T6は共有ロックを取得できます。 -
Q: T3が共有ロックを取得した後、T6も共有ロックを取得できるのはなぜですか?
A: 問題文で、共有ロック中のデータに対する別の共有ロック要求は成功すると示されているからです。
関連キーワード: トランザクション、共有ロック、占有ロック、排他制御
設問3:
問題文を見る 出荷トランザクションT7の処理内容を表3に示す。次の記述中のに入れる正しい答えを、解答群の中から選べ。
なお、トランザクションT7は、図3の①〜⑧の順で在庫数データを処理する。


データをロックしている時間を最も短くするためには、“赤絵の具の在庫数データをロックする。”を挿入すべき適切な位置はcで、“白絵の具の在庫数データのロックを解除する。”を挿入すべき適切な位置はdである。
なお、ほかのトランザクションとのデッドロックの発生に対する考慮は不要とする。
解答群
ア:α
イ:β
ウ:γ
エ:δ
オ:ε
模範解答
c:イ、d:エ
解説
解答の導き方
この設問では、白絵の具と赤絵の具の在庫数データについて、ほかの処理から守るためにロックする期間を、できるだけ短くする位置を考えます。ロックとは、ほかのトランザクション(ひとまとまりの処理)が同じデータを操作できないよう、一時的に制限することです。
図3では、白絵の具の在庫数データを①でロックし、②で読み込みます。その後、白絵の具の在庫数を減らして⑤で書き込みます。データを読み込んでから変更し、書き込むまでの間にほかの処理が割り込むと、計算や書き込みの結果が正しくなくなるおそれがあります。そのため、白絵の具のロックは、少なくとも⑤の書き込みが終わるまでは必要です。
白絵の具のデータを使う最後の処理は⑤です。したがって、⑤の直後にロックを解除すれば、必要な保護を保ちながら、ロック時間を最短にできます。この位置はδなので、dはエです。⑤より前に解除すると、書き込みの前にほかの処理が割り込む可能性があります。一方、⑤より後までロックすると、白絵の具のデータを使っていない間もロックし続けることになります。
次に、赤絵の具の在庫数データは③で読み込まれ、⑥で変更され、⑦で書き込まれます。読み込む前にロックしておけば、読み込んだ値を使って書き込むまで、ほかの処理による変更を防げます。したがって、ロックを入れる位置は③より前です。
候補のβは③の直前にあたります。γは③の後なので、ロックする前に赤絵の具の在庫数を読み込んでしまいます。αはもっと前で、必要以上に赤絵の具のデータをロックすることになります。よって、最も適切なのはβであり、cはイです。
誤りやすいポイント
- 赤絵の具のデータを、読み込んだ後にロックするのは遅すぎます。読み込んだ値が、ロックするまでの間にほかの処理によって変わる可能性があるためです。
- 白絵の具のデータは、値を計算した④ではなく、書き込みを終える⑤までロックが必要です。
- 使い始める前からロックすれば安全ですが、必要以上に長くロックすると、設問で求める「データをロックしている時間を最も短くする」という条件を満たしません。
FAQ
Q: 赤絵の具のロックを、白絵の具のロックと同時に始めてはいけませんか?
A: その位置でも赤絵の具の読み込みには間に合いますが、赤絵の具を使うより前からロックすることになります。必要になる直前のβでロックするほうが、ロック時間を短くできます。
A: その位置でも赤絵の具の読み込みには間に合いますが、赤絵の具を使うより前からロックすることになります。必要になる直前のβでロックするほうが、ロック時間を短くできます。
Q: 白絵の具のロックを④の直後に解除できないのはなぜですか?
A: ④は在庫数を計算する処理で、データへの書き込みは⑤です。⑤を終える前に解除すると、計算した値を書き込むまでに、ほかの処理が白絵の具の在庫数を変更する可能性があります。
A: ④は在庫数を計算する処理で、データへの書き込みは⑤です。⑤を終える前に解除すると、計算した値を書き込むまでに、ほかの処理が白絵の具の在庫数を変更する可能性があります。
Q: 赤絵の具のロックは、どこで解除しますか?
A: 図3では、赤絵の具の在庫数データの書き込みは⑦で、そのロック解除は⑧です。読み込みから書き込みまで赤絵の具のデータを守るため、⑦の後に解除します。
A: 図3では、赤絵の具の在庫数データの書き込みは⑦で、そのロック解除は⑧です。読み込みから書き込みまで赤絵の具のデータを守るため、⑦の後に解除します。
関連キーワード: トランザクション、ロック、排他制御、同時実行制御、データ整合性
設問4:
問題文を見る 表4に示すトランザクションT8〜T11のうち、解答群の組合せの中から、同時に処理された場合にデッドロックが発生する可能性のある組合せを選べ。
なお、トランザクションT8〜T11では、各絵の具の在庫数データをどのような順番で処理するかは、分からないものとする。
解答群
ア:T8, T9
イ:T8, T9, T10
ウ:T9, T10, T11
エ:T10, T11模範解答
イ
解説
解答の導き方
この問題では、複数の在庫データを扱うトランザクション同士で、デッドロックが起きる可能性を考えます。
ロックとは、あるデータをほかの処理が同時に変更しないようにするための仕組みです。すでに別のトランザクションがロックしているデータを使おうとすると、ロックが解除されるまで待ちます。
デッドロックは、複数のトランザクションが互いに相手のロック解除を待ち、処理を進められなくなった状態です。たとえば、次のような待ち方です。
- トランザクションAは、Bがロックしているデータを待つ
- Bは、Cがロックしているデータを待つ
- Cは、Aがロックしているデータを待つ
このように待ち方が輪になっていると、誰も先に進めません。
表4から、各トランザクションが扱う在庫データを整理します。
設問には、在庫データを処理する順番は分からないとあります。つまり、複数のデータを扱うトランザクションでは、あるデータをロックしてから、別のデータのロックを待つ状況が起こり得ます。
選択肢を見ていきます。
-
ア:T8, T9
T8とT9が共通して扱うのは赤絵の具だけです。一方が赤絵の具をロックして、もう一方が待つことはあります。しかし、2つのトランザクションの間で待ち方が輪になるには、互いに相手がロックしている別のデータも必要です。この組合せにはそのような共通データがないため、デッドロックは起きません。 -
イ:T8, T9, T10
3つのトランザクションを、次のようにそれぞれ別のデータをロックした状態にできます。- T8が白絵の具をロックする
- T9が赤絵の具をロックする
- T10が青絵の具をロックする
その後、各トランザクションが次のデータを必要とすると、次のように待ち合う可能性があります。- T8は、T9がロックしている赤絵の具を待つ
- T9は、T10がロックしている青絵の具を待つ
- T10は、T8がロックしている白絵の具を待つ
待ち方が輪になり、どのトランザクションも処理を進められません。したがって、この組合せではデッドロックが起きる可能性があります。 -
ウ:T9, T10, T11
3つのトランザクションが共通して扱うデータは青絵の具だけです。青絵の具をロックしたトランザクションに対して、ほかのトランザクションが待つことはあります。しかし、青絵の具以外のデータは、この組合せの中ではそれぞれ別のトランザクションだけが扱います。そのため、待ち方が輪にはなりません。 -
エ:T10, T11
T10とT11が共通して扱うのは青絵の具だけです。アと同じように、一方がもう一方を待つことはあっても、互いに待ち合う状態にはなりません。
以上から、デッドロックが発生する可能性があるのは、3つの在庫データを介して待ち方が輪になるイです。
誤りやすいポイント
-
同じデータを使うトランザクションがあれば、必ずデッドロックになると思う
同じデータを使うだけなら、一方が待つだけで済むことがあります。デッドロックには、待ち方が輪になることが必要です。 -
2つのトランザクション間だけで考える
デッドロックは、イのように3つ以上のトランザクションが順番に待ち合って発生することもあります。 -
扱うデータの順番が分からない点を見落とす
順番が決まっていないため、各トランザクションが異なるデータを先にロックし、次のデータを待つ状況が起きる可能性があります。
FAQ
Q: ロックを待っている状態は、すべてデッドロックですか?
A: いいえ。ほかのトランザクションが処理を終えてロックを解除すれば、待っている処理は再開できます。待ち方が輪になり、互いに解除を待ち続ける状態がデッドロックです。
A: いいえ。ほかのトランザクションが処理を終えてロックを解除すれば、待っている処理は再開できます。待ち方が輪になり、互いに解除を待ち続ける状態がデッドロックです。
Q: なぜイでは、在庫データを1種類ずつ別のトランザクションがロックできるのですか?
A: T8、T9、T10はそれぞれ白絵の具、赤絵の具、青絵の具を扱います。処理順が決まっていないため、それぞれが別のデータを先にロックする実行順序があり得ます。
A: T8、T9、T10はそれぞれ白絵の具、赤絵の具、青絵の具を扱います。処理順が決まっていないため、それぞれが別のデータを先にロックする実行順序があり得ます。
Q: デッドロックを防ぐにはどうすればよいですか?
A: 複数のデータをロックするとき、すべてのトランザクションで同じ順番にロックする方法があります。ロックする順番を統一すると、待ち方が輪になる状況を避けやすくなります。
A: 複数のデータをロックするとき、すべてのトランザクションで同じ順番にロックする方法があります。ロックする順番を統一すると、待ち方が輪になる状況を避けやすくなります。
関連キーワード: トランザクション、排他ロック、デッドロック、排他制御、循環待ち



