DBデータベーススペシャリスト試験 午後Ⅰ
平成26年度春期 データベーススペシャリスト 午後Ⅰ 問2
事例を読んで設問の答えを考えてから、解説のポイントとIPA公式の解答例・採点講評で確認しましょう。
問題











解き方のヒントを見る
同時実行時の整合性を考える視点
複数の処理が重なる場面では、個々の操作だけでなく、予約から確定までの流れを一つのまとまりとして捉え、途中状態が他の処理にどう影響するかを確認します。順序と境界に注目します。
この問題で問われていること
確認の中心は、同じ資源を扱う処理同士がどの時点で関わり、処理の途中で見える状態と最終的に確定する状態の関係が保たれているかを整理することです。この一点に絞って見直します。
視点
処理を個別の命令ではなく、開始から確定までの単位として眺め、他の処理との重なりによって状態の見え方や確定順序が変わり得る箇所を整理します。
確認ポイント
- 対象となる共有資源と、それを参照・更新する処理の範囲を対応づける
- 処理の途中と確定後で、他の処理から見える状態を区別する
- 重なりが起きた場合に、どの順序や境界を基準に整合性を判断するか確認する
正解と解説を見る
解説
会議室予約を題材に、時間帯の重複を判定するSQL、主キー制約による競合検知、ロックの保持時間、予約単位をコマに分割した排他制御を問う問題です。
問題の全体像
K社の会議室予約システムでは、同じ会議室の重複時間帯を予約できないようにする必要がある。元の処理は、重複予約をSELECTで確認してからINSERTするため、同時実行時には両方が空きと判断してダブルブッキングが起こり得る。設問1ではSQLと競合結果、設問2では日別管理テーブルによる改善案のロックや障害時の問題、設問3では予約枠ごとの更新による改良結果を確認する。出題趣旨では、SQL設計に加え、トランザクション制御と排他制御を理解して同時実行性を設計する力を評価している。
設問1(1)
公式解答例は、[a]NOT EXISTS、[b]<、[c]>としている。空き会議室の検索なので、対象会議室について重複する予約行が存在しないことをNOT EXISTSで表す。時間帯は、既存予約の開始時刻が希望終了時刻より前、かつ既存予約の終了時刻が希望開始時刻より後である場合に重なるため、比較演算子はそれぞれ<と>になる。境界で一方の終了時刻と他方の開始時刻が一致する場合は重複とは扱わない。
設問1(2)
公式解答例は「主キーの値が重複するから」などとしている。図1の会議室予約の主キーは会議室番号、予約日、予約開始時刻で構成される。同じ開始時刻の予約を同時に登録しようとすると、先に登録された行と主キーが重複するため、後続のINSERTは行を挿入できない。答案では、主キー重複または三つの主キー項目が同じ行の存在を30字以内で示せばよい。
設問1(3)
実行が重ならない場合、公式解答例は[d]×・[e]①、[f]○・[g]空欄、[h]×・[i]①としている。Aの予約後、BとCは既存予約と時間帯が重なるため図3①のSELECTで失敗する。DはAと終了・開始が接するだけなので成功し、Eは既存予約と重なるため①で失敗する。同時実行では、公式解答例は[j]×・[k]②、[l]△・[m]空欄、[n]○・[o]空欄、[p]△・[q]空欄です。AとBは開始時刻が同じなので後続のINSERTが主キー重複を検知する。一方、AとC、AとEは時間帯が重なるが開始時刻が異なるため、両方のINSERTが通りダブルブッキングとなる。AとDは時間帯が重ならないため、両方とも成功する。
設問1(4)
公式解答例は[r]時間帯、[s]予約開始時刻としている。ダブルブッキングには、二つの予約の時間帯が重なることが必要です。しかし、開始時刻が同じなら主キー重複で後続処理が失敗するため、両方が登録されるには予約開始時刻が異なる必要がある。したがって、時間帯が重なり、予約開始時刻が異なる場合が条件になる。
設問2(1)(処理番号)
公式解答例は処理番号①としている。①では、日別予約管理の予約処理中フラグをNからYへ更新する。この更新による専有ロックはトランザクション終了まで保持されるため、同じ日・同じ会議室への予約が集中すると、後続処理が①の行のロック解放を待つことになる。
設問2(1)(原因)
公式解答例は「多数の専有ロックの解放待ちが発生する」としている。図5②でコミットしなければ、①で取得した専有ロックを保持したまま③以降の処理を続ける。その間、同じ日・同じ会議室を処理する多数のトランザクションがロック待ちとなり、同時に処理できる件数が減少する。
設問2(2)
公式解答例は「予約対象に予約が入っている状況」としている。図5④では、①の更新に失敗して予約処理中フラグを取得できなくても、③のSELECTで対象時間帯に既存予約があることを確認できた場合を想定する。この場合はロック取得を繰り返さず、既に予約済みなので⑧へ進んで速やかに失敗を通知する。
設問2(3)(状態)
公式解答例は、「日別予約管理」テーブルの予約処理中フラグがYのままとなる状態としている。図5②のコミット後に⑤~⑦で障害が起きると、⑥のNへの更新や⑦のコミットまで到達できない。一方、②は既に完了しているため、そのテーブルのYは元に戻らず残る。
設問2(3)(問題)
公式解答例は、その日付・その会議室を誰も予約できなくなるとしている。予約処理中フラグがYのままだと、後続の予約処理は日別予約管理の行をNからYへ更新できない。結果として、実際には予約処理中でないのに、その日・会議室の予約受付が停止する。
設問3(1)
公式解答例は[t]COUNT(*)としている。図7①のSELECTは、指定された会議室・日付・時間範囲について、予約済フラグがNのコマを数える。GROUP BYで会議室ごとにまとめ、空きコマ数が予約に必要なコマ数PERIODCOUNT(:hv2、:hv3)と一致する場合に、範囲内の全コマが空いていると判断できる。
設問3(2)
公式解答例は、①の終了後、②の終了までの間に他の予約処理が範囲内のコマへ予約を入れた状況としている。①では全コマが空きと確認できても、②のUPDATEをコマ数分繰り返す間に別トランザクションが先に一部の予約済フラグをYへ変更することがある。そのコマはWHERE句の予約済フラグ=Nに一致せず更新行がなくなり、予約失敗としてロールバックされる。
学習のポイント
SQL条件だけでなく、トランザクションの順序とロックの解放時点まで追跡する力を養う。
出典:独立行政法人 情報処理推進機構(IPA)平成26年度春期 データベーススペシャリスト試験 午後Ⅰ 問2(公式資料:問題冊子(PDF) / 解答例 / 採点講評)
関連する過去問一覧
IPA Advancedは非公式の学習サイトです。解説にはAIによる補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針