DBデータベーススペシャリスト試験 午後Ⅰ

令和6年度秋期 データベーススペシャリスト 午後Ⅰ 問2

事例を読んで設問の答えを考えてから、解説のポイントとIPA公式の解答例・採点講評で確認しましょう。

問題

問2 総合商社の労務管理システムのデータベース実装に関する次の記述を読んで,設問に答えよ。 総合商社のY社は,労務管理にRDBMSを用いている。既存の勤怠管理機能に,新たに所在情報管理機能と監査機能を追加することになった。 〔RDBMSの排他制御〕 1. ロックは行単位で掛ける。共有ロックを掛けている間,他のトランザクションから対象行への共有ロックは可能であり,専有ロックは共有ロックの解放待ちとなる。専有ロックを掛けている間,他のトランザクションから対象行への共有ロック及び専有ロックは,専有ロックの解放待ちとなる。 2. 索引を使わずに表探索で全ての行に順次アクセスする場合,検索条件に合致するか否かにかかわらず全行をロックの対象とする。索引探索の場合,索引から読み込んだ行だけをロックの対象とする。 〔所在情報管理機能の追加〕 1. 機能の概要 オフィス内のフリーアドレス化を推進するため,従業員の就業エリア(以下,エリアという)への入退室のログを記録し,従業員の所在情報をエリア情報表示端末で社内に公開する。エリア情報表示端末では,エリアの混雑状況なども表示する。 エリアには,建屋,フロア,執務室があり,従業員は各エリアへの入退室時にICカード社員証で認証を行う。従業員は入退室時に必ず認証を行うように定められており,他の従業員に続いて認証せずに入退室することは禁止されている。従業員は,建屋内にいる限りいずれかのエリアに所在しており,建屋から出ることで退出として扱われる。 所在情報管理機能では,認証時に入退室ログを記録する。また,記録した入退室ログを基に,従業員の現在位置を示す所在情報及びエリアの混雑状況を定期的に更新する。 2. テーブル構造 主なテーブルのテーブル構造は,図1のとおりである。主キーには主索引が定義されている。 3. 入退室ログ登録処理 従業員が入退室で認証する都度,“入退室ログ”テーブルに行を追加する。ログIDは時系列に昇順で採番し,入退室区分には入室('I')又は退室('O')を設定する。必要に応じて,連携する勤怠管理機能及びエリア情報表示端末に情報を送信する。処理の概要を図2に示す。トランザクションのISOLATIONレベルはREPEATABLE READとする。 4. 所在情報更新処理 5分ごとに実行するバッチ処理で,定期的にエリア状況及び所在情報を更新する。“入退室ログ”テーブルに登録されている入退室ログを読み込み,“エリア状況”テーブルのエリアごとの在席者数を更新し,“所在情報”テーブルの従業員ごとの最終入室エリアコードを更新する(退出している場合は,最終入室エリアコードには'9999'を設定する)。全ての更新が終わったら,読み込み終わった入退室ログの位置を記録しておき,次回実行時はその続きから読み込む。所在情報更新処理の概要を図3,所在情報更新処理に用いるSQL文を表1に示す。トランザクションのISOLATIONレベルはREPEATABLE READとする。 〔監査機能の追加〕 従業員の残業時間,休暇,エリアを,入退室ログと突き合わせてチェックする監査機能を,要件に基づいて設計した。 1. 監査機能の要件 (1) 監査対象月の1日から月末日までの勤怠をチェックする。監査対象月の月末の営業日から翌月の5営業日までの間,毎日実行する。 (2) 上長承認済み,かつ,監査未チェックの勤怠を対象にチェックする。なお,一度監査が終了した行でも,勤怠情報を従業員が更新した場合は,上長承認と監査結果をリセットして,再度,上長承認及び監査を行う。 (3) 監査機能のジョブは多重実行する。全てのジョブに一意なジョブIDを割り当て,それぞれのジョブに重複していない従業員番号の範囲を指定して実行する。また,処理の途中で失敗した場合,その原因を取り除いて,同じジョブIDで再実行することで,処理を再開する。なお,ジョブIDは再利用する。 2. 監査機能のテーブル設計 主なテーブルのテーブル構造は図4のとおりである。主キーには主索引が定義されている。“勤怠”テーブルには,従業員ごと年月日ごとの勤怠情報を記録する。上長承認には承認済み('Y')又は未承認('N')を設定する。監査結果には監査未チェックの行はNULLを設定し,チェックしたら適正('Y')又は不適正('N')を設定する。監査機能のジョブが途中で失敗した場合に,ジョブを再実行するために“再開位置”テーブルを使用する。再開従業員番号には処理中の従業員番号を記録し,再実行時には記録していた従業員番号から処理を再開する。 3. 監査機能の処理設計 処理の流れとSQL文を図5に示す。トランザクションのISOLATIONレベルはREAD COMMITTEDとする。監査機能の実行時には他トランザクションも実行されており,排他ロック解放待ちタイムアウトの考慮も必要である。排他ロック解放待ちタイムアウト時間をT秒とすると,他トランザクションで排他ロック解放待ちタイムアウトさせないための図5中のN行を見積もる計算式は,次の式となる。 N <(T − Aに必要な時間)÷ Bに必要な時間 設問1〔所在情報管理機能の追加〕について答えよ。 (1) 表1中のa〜dに入れる適切な字句を答えよ。 (2) 所在情報更新処理を実行中に,入退室ログ登録処理が発生するとデッドロックとなる可能性がある。デッドロックを引き起こすロックの状況について,時系列に,対象となるテーブル名,ロックを掛けるトランザクション,ロック種別,ロック状態を答えて,次に示す表2を完成させよ。なお,ロックを掛けるトランザクション,ロック種別,ロック状態については,表中の該当する方を○で囲んで示せ。 (3) (2)のデッドロックを回避するために,図2の入退室ログ登録処理の処理順序を変更する。変更内容を,図2中の①〜③を用いて20字以内で答えよ。 設問2〔監査機能の追加〕について答えよ。 (1) 図5中のe〜hに入れる適切な字句を答えよ。 (2) 図5中のアで行うべき処理を40字以内で答えよ。 (3) AとBの対象となる処理に該当するものを,図5中の④〜⑬から選べ。なお,該当する処理が複数ある場合は全て選ぶこと。
図1 主なテーブルのテーブル構造(一部省略)。従業員,エリア状況,所在情報,入退室ログの関係スキーマ。
図1 主なテーブルのテーブル構造(一部省略)。従業員,エリア状況,所在情報,入退室ログの関係スキーマ。
図2 入退室ログ登録処理の概要。ログ挿入,所在情報参照,混雑判定,コミットの順序。
図2 入退室ログ登録処理の概要。ログ挿入,所在情報参照,混雑判定,コミットの順序。
図3 所在情報更新処理の概要。SQL1〜SQL6を用いる更新手順。
図3 所在情報更新処理の概要。SQL1〜SQL6を用いる更新手順。
表1 所在情報更新処理に用いるSQL文(未完成)。SQL1〜SQL6と空欄a〜d。
表1 所在情報更新処理に用いるSQL文(未完成)。SQL1〜SQL6と空欄a〜d。
図4 監査機能に関するテーブルのテーブル構造。勤怠と再開位置。
図4 監査機能に関するテーブルのテーブル構造。勤怠と再開位置。
図5 監査機能の処理の流れとSQL文(未完成)。カーソル,再開位置,空欄e〜h,ア,A,B。
図5 監査機能の処理の流れとSQL文(未完成)。カーソル,再開位置,空欄e〜h,ア,A,B。
表2 ロック状況(未完成)。時系列ごとのテーブル名,トランザクション,ロック種別,ロック状態。
表2 ロック状況(未完成)。時系列ごとのテーブル名,トランザクション,ロック種別,ロック状態。
解き方のヒントを見る

処理の時間軸と資源の関係を整理する

複数の処理が同じデータに関わる場面では、各処理がいつどの資源を扱い、どの時点で解放するかを時系列で並べて考えることが検討の出発点になります。問われている内容を一つずつその時系列に当てはめて確かめましょう。

この問題で問われていること

排他制御や再実行の設計を考える際は、処理が途中で止まった場合や他の処理と重なった場合に、データの状態がどうなっているかを場面ごとに想定できるかが検討の鍵になります。時系列の整理がその土台になります。

視点

ロックやトランザクションに関する検討では、用語の定義を覚えているかよりも、複数の処理が並行したときに何が起きるかを具体的な場面として追えるかが大切です。処理ごとに、開始、資源の取得、更新、確定や取消しといった節目を横に並べます。節目同士の前後関係を見比べると、どこで競合や待ちが生じ得るかを自分の手で確かめられます。中断後にやり直すときにどの状態から始まるかも、同じ方法で確かめられます。結論を急がず、まず場面を描き出すことを優先しましょう。

確認ポイント

  • 各処理が資源を扱い始める時点と手放す時点を、処理ごとに書き出せているか
  • 二つ以上の処理を同じ時間軸に並べたとき、互いに待ち合う場面が生じ得るかを自分で確かめたか
  • 処理が途中で中断した後にやり直す場面も、同じ時系列の中に置いてデータの状態を追えているか
正解と解説を見る

解説

労務管理システムに所在情報管理機能と監査機能を追加する事例を題材に、SQL設計、REPEATABLE READでのデッドロックの分析とアクセス順序の統一による回避、WITH HOLDカーソルとN行ごとのコミットによる再実行可能なバッチ設計、排他ロック解放待ちタイムアウトを起こさないためのN行の見積りを問う問題です。

問題の全体像

Y社は勤怠管理機能に、所在情報管理機能と監査機能を追加します。所在情報管理機能では、認証のたびに入退室ログ登録処理(図2、REPEATABLE READ)が動きます。一方、5分ごとのバッチである所在情報更新処理(図3・表1、REPEATABLE READ)が“エリア状況”と“所在情報”を更新します。監査機能(図5、READ COMMITTED)は、WITH HOLDカーソルで“勤怠”を読み、N行ごとに再開位置の更新とコミットを行う多重実行ジョブです。出題趣旨では、SQLの設計能力に加え、トランザクション制御と排他制御を理解して、適切な同時実行性を満たす設計能力を問うとしています。採点講評では、設問1(2)の時系列2〜4と設問2(3)の正答率が低かったと指摘されています。

設問1(1)

SQL2は、エリアごとに「入室した人数−退室した人数」を求める式です。CASE式で該当する行を1、それ以外を0にして合計するので、aは公式解答例のとおりSUMです。入室は入退室区分'I'、退室は'O'なので、bは「入退室区分 = 'I'」、cは「入退室区分 = 'O'」になります。SQL5でもbを使います。従業員の最新のログが入室であればそのエリアコードを、そうでなければ退出を示す'9999'を返す、という条件になっています。SQL4は、従業員ごとに今回の範囲の中で最新の入退室ログを取得する文です。ログIDは時系列に昇順で採番されるので、dは公式解答例のとおりMAX(ログID)です。

設問1(2)

両方の処理が、どのテーブルにどの順番でアクセスするかを整理します。所在情報更新は、図3の②でSQL3(“エリア状況”のUPDATE)を実行し、次に③でSQL6(“所在情報”のUPDATE)を実行します。どちらも専有ロックです。入退室ログ登録は、図2の②で“所在情報”を参照し、次に③で“エリア状況”を参照します。どちらも共有ロックです。両方ともREPEATABLE READなので、ロックはコミットまで解放されません。つまり二つの処理はテーブルに逆の順番でアクセスします。公式解答例の表2は次のとおりです。時系列1では、テーブル“エリア状況”に所在情報更新が専有ロックを掛け、ロック済みになります。時系列2では、テーブル“所在情報”に入退室ログ登録が共有ロックを掛け、ロック済みになります。時系列3では、入退室ログ登録が“エリア状況”に共有ロックを掛けようとしますが、時系列1の専有ロックと両立しないため、ロック解放待ちになります。時系列4では、所在情報更新が“所在情報”に専有ロックを掛けようとしますが、時系列2の共有ロックと両立しないため、ロック解放待ちになります。互いに相手のロックの解放を待つので、デッドロックになります。公式解答例の備考では、時系列3と4は順不同とされています。採点講評は、デッドロックになっていない解答が見られたこと、トランザクションの処理内容から「どのテーブルにどのロックが必要か」を読み取れていない受験者が多かったことを指摘しています。

設問1(3)

デッドロックの原因は、二つのトランザクションが“エリア状況”と“所在情報”に逆の順番でアクセスすることです。所在情報更新は“エリア状況”→“所在情報”の順なので、入退室ログ登録も同じ順番にします。つまり、③(“エリア状況”の参照)を先に、②(“所在情報”の参照)を後にします。こうすると、後から来た処理は最初のテーブルで待つだけになり、循環待ちが起きません。公式解答例は「②と③の処理順序を入れ替える。」です。20字以内の答案では「②と③を入れ替える」ことがはっきり分かるように書きます。

設問2(1)

カーソルの読込み範囲は、再実行を考えて開始側を再開位置にします。②-1と②-2で、HTARGETIDには初回は開始従業員番号が、再実行時は再開従業員番号が設定されます。そのため、eは:HTARGETID、fは終了従業員番号の:HENDIDです。要件(2)の「監査未チェック」は、監査結果がNULLの行を指すので、gはIS NULLです。再開位置は従業員番号で記録し、再開もその従業員番号から行います。そのため、処理順序は従業員番号順でなければならず、hは従業員番号です。同じ従業員の行を途中から再び読んでも、チェック済みの行は監査結果がNULLではないので対象外になります。

設問2(2)

要件(3)では、ジョブIDを再利用します。②では、“再開位置”にHJOBIDの行が残っていると、再実行とみなしてその再開従業員番号から処理を始めます。ジョブが正常に終わってもこの行が残っていると、翌日以降に同じジョブIDで実行したとき、処理範囲の先頭(HBEGINID)からではなく途中から始まってしまいます。そこで、正常に終了したら⑬でコミットする前に、該当する行を消しておく必要があります。公式解答例は「“再開位置”テーブルからジョブIDがHJOBIDの行を削除する。」です。40字以内の答案には、対象のテーブル(再開位置)、条件(ジョブIDがHJOBID)、操作(削除)の三つを入れます。

設問2(3)

⑨のUPDATEで“勤怠”の行に掛けた専有ロックは、⑩のコミットまで保持されます。図5の④にあるとおり、⑩は毎回ではなく、N行ごとに一度だけ実行します。⑩では再開位置を更新してからコミットするので、ここでロックが解放されます。したがって、1回のロック保持時間は「⑤〜⑨をN回分」と「⑩を1回分」の合計です。これがT秒を超えなければ、ほかのトランザクションはタイムアウトしません。式をN×(⑤〜⑨の時間)+(⑩の時間)<Tと置き、変形するとN<(T−⑩の時間)÷(⑤〜⑨の時間)になります。つまりAは、N行ごとに一度必要になる⑩(再開位置の更新とコミット)で、Tから差し引く処理です。Bは、1行ごとに繰り返す⑤(カーソルから1行読む)、⑥・⑦・⑧(チェック)、⑨(監査結果の更新)です。公式解答例もAを⑩、Bを⑤、⑥、⑦、⑧、⑨としています。④はループの制御、⑪〜⑬はループの外で1回だけ実行する処理なので、どちらにも含めません。採点講評は、この設問の正答率が低かったと述べ、どの区間でロックが続き、どの契機で解放されるかをよく考えるよう求めています。

学習のポイント

処理の手順ごとに、どのテーブルのどの行へどのロックを掛け、いつ解放するかを時系列で追う練習をしましょう。とくにデッドロックの表を作る問題と、コミット間隔からロック保持時間を見積もる問題が重要です。

出典:独立行政法人 情報処理推進機構(IPA)令和6年度秋期 データベーススペシャリスト試験 午後Ⅰ 問2(公式資料:問題冊子(PDF) / 解答例 / 採点講評)

関連する過去問一覧

IPA Advancedは非公式の学習サイトです。解説にはAIによる補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針