AOBA's Information Processing Education
1998/08/29
注意1:このページは、回線を切断した後でゆっくりご覧になってください(テキストを印刷する場合は、その取り扱いに注意してください)。
注意2:背景が白地の画面を長時間見つめていると頭が痛くなってしまいますので、ここは背景をグレーにしています。
「平成9年秋期 第2種 午後 問4」 問4 データベースに関する次の記述を読んで、設問1,2に答えよ。
データベースを、複数の利用者が更新したり参照したりする場合には、その更新・参照の正しさを保証するための仕組みが必要である。
例えば、E君とF君があるデータベースの同一のレコードをほとんど同時に更新する場合、次のようなことが問題になると考えられる。
- E君とF君が、同一のレコードをほとんど同時に読み出す。
- E君が、1.で読み出したレコードを変更し、書き込む。
- 続いてF君が、1.で読み出したレコードを変更し、書き込む。
- E君は、更新したレコードを読み出し、自分の更新が反映されていないことに気づく。
設問1 次の記述中の( )に入れる正しい答えを、解答群の中から選べ。
![]()
この問題を解決するためには、E君が( a )レコードを( b )までは、F君を含めて誰にもこのレコードが読み出せないようにすればよい。このように、他からの参照を禁止したり、許したりすることを相互排除(排他制御)という。
aに関する解答群
ア 書き込んだ イ 読み出したbに関する解答群
ア 書き込む イ 読み出す設問2 次の記述中の( )に入れる正しい答えを、解答群の中から選べ。
ある資源に対して、他人(又は他のトランザクション)からの利用を禁止することが必要になることがある。設問1の方法はロック方式という。これ以外に、データベース資源をロックしない次のような時刻印(タイムスタンプ)を使う方式がある。
- 各トランザクションは、開始時に時刻印が与えられる。この時刻印はシステム全体で唯一であり、順序の付けられる値である。この値Tは、開始時刻が後になるほど大きな値となる。
- 各レコードには、時刻印を記録する領域が二つあり、レコードを最後に読み出したトランザクションの時刻印と、レコードを最後に書き込んだトランザクションの時刻印が記録されている。レコードxの読み出し時刻印をTr(x),書込み時刻印をTw(x)とする。この領域に対する更新および参照の正しさは、保証されている。
- 各トランザクションの読み出し操作は、次の規則に従う。
T<Tw(x)であるときは、既に他の新しいトランザクションがレコードxを書き込んでいるので、このトランザクションは、レコードxを読み出さない。このトランザクションの今までの処理は、すべて破棄され、新たな時刻印が与えられて、最初の状態から再実行される。
T≧Tw(x)であるときは、レコードxを読み出し、T>Tr(x)のときは、レコードxの読み出し時刻印の記録領域にTを書き込む。- 各トランザクションの書込み操作は、次の規則に従う。
( c )であるときは、他の新しいトランザクションがレコードxに対して、読み出し又は書込みを行っているので、このトランザクションは、レコードxを書き込まない。このトランザクションの今までの処理は、すべて破棄され、新たな時刻印が与えられて、最初の状態から再実行される。
( d )であるときは、このトランザクションが最も新しいので、レコードxを書込み、レコードxの書込み時刻印の記録領域にTを書き込む。解答群
ア T<Tr(x) イ T≧Tr(x) ウ T<Tw(x) エ T≧Tw(x) オ T<Tr(x) かつ T<Tw(x) カ T≧Tr(x) かつ T≧Tw(x) キ T<Tr(x) 又は T<Tw(x) ク T≧Tr(x) 又は T≧Tw(x)
解説 問題自体はかなり難しいのに、答えはやけに易しいという不思議な問題です。
設問1について
特に解説は不要でしょう。
「E君が読み出したレコードを書き込むまでは、F君を含めて誰もこのレコードが読み出せないようにすればよい」
です。
以下の図を参考にしてください。
![]()
t1の時点でE君(のトランザクション)がレコードxを読み出すと、レコードxはE君(のトランザクション)に占有されます。その後、t2の時点でE君がレコードxを書き込むと、E君に占有されていたレコードxが解放され、他のトランザクションからのアクセスが許可されます。
設問2
cについて
設問をほとんど読まずとも解答可能です。設問2の4.の最初に以下の記述があります。「( c )であるときは、他の新しいトランザクションがレコードxに対して、読み出し又は書込みを行っているので....(又は に注目)」
まず、自分のトランザクションのタイムスタンプはTですね。それよりも新しいトランザクションがレコードxに対して読み出しを行っていれば、T<Tr(x)の条件が成り立ちます(新しければ、タイムスタンプは大きな値になるから)。
同じように、新しいトランザクションがレコードxに対して書込みを行っていれば、T<Tw(x)の条件が成り立ちます。
これを又はで結合すればいいのですから、答えは”T<Tr(x) 又は T<Tw(x)”です。dについて
空欄cの条件は、レコードxに書込みを行えないケースです。一方空欄dの条件は、レコードxに書込みを行えるケースです。
すると、空欄cの条件の否定をとれば、求める答えになるはずです。
だから答えは、”T≧Tr(x) かつ T≧Tw(x)”です(否定をとるには、比較演算子,論理演算ともに逆にすればよい)。補足
答えは簡単に求まりましたが、設問2で行っている制御方式は結構ややこしいので、ここで簡単に補足します。
まず、設問2の制御方式の発想は、「一つの資源を複数のトランザクションが利用する場合、新しいトランザクションの方を優先させ、古いトランザクションに制限を加えよう」というものです。
レコードxの読み出し時刻印(Tr(x))と、書込み時刻印(Tw(x))を書き出す条件を考えたりすると、深みにはまって逆に答えが難しくなります。しかし、この記録領域は、読み出しおよび書込みを行ったトランザクションの中で、最も新しいトランザクション(の時刻印)を記録している領域でしかありません。つまりこれは、トランザクションが新しいか古いかを判定するため領域で、それ以上の深い意味はないのです。以下の例を参照してください。
F君のトランザクション開始前はTr=3,Tw=3であったとします。ここでT=4としてF君のトランザクションが開始し、その後、T=5としてE君のトランザクションが開始しました。
![]()
E君はt1の時点で読み出しを行いました。そこで、Tr=5に更新されますが、Tr=5に更新されたことにより、F君のトランザクションは読み出しのみ可能となります(仮に、t2でF君が書込みを行ったとすると、さらにt3でE君が書込みを行って、データ矛盾が発生してしまいます)。
F君はt2の時点で読み出しを行いますが、ここではTrは更新されません。なぜなら、F君のタイムスタンプはT=4であり、Trは既にもっと新しいトランザクションで読み出しを行って5に更新されているからです。
E君はt3の時点で書込みを行いました。そこでTw=5に更新されますが、Tw=5に更新されたことにより、F君のトランザクションは読み出し,書込みともに不可となります。今週は以上です。
ではまた来週。
解答
設問1 a−イ b−ア 設問2 c−キ d−カ