データベーススペシャリスト 2024年 午後1 問02
総合商社の労務管理システムのデータベース実装に関する次の記述を読んで、設問に答えよ。
総合商社の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)に入れる適切な字句を答えよ。
模範解答
a:SUM
b:入退室区分 = 'I'
c:入退室区分 = 'O'
d:MAX(ログID)
解説
解答の論理構成
-
目的を確認
【問題文】「“エリア状況”テーブルのエリアごとの在席者数を更新」とあり、SQL2はそのための増減数を求めるサブクエリです。 -
算出方法を読み取る
SQL2の完成形は
sql SELECT エリアコード, SUM(CASE WHEN (b) THEN 1 ELSE 0 END)- SUM(CASE WHEN (c) THEN 1 ELSE 0 END) AS 在席者増減数 FROM 入退室ログ … GROUP BY エリアコード
となる想定で、入室(入退室区分 = 'I')は+1、退室(入退室区分 = 'O')は-1の計を取りたいことがわかります。 -
選択肢を比較
・COUNT は行数を返すだけで、符号を付けた加減には適しません。
・MAX / MIN は値の最大・最小を返すだけで、合計には不適切。
・よって正解は合計を返す SUM 一択です。 -
結論
以上より (a) は SUM となります。
誤りやすいポイント
- COUNT で代用できると考えてしまう
COUNT では正負の加算ができず、差分計算が不可能です。 - 式全体を1つの SUM で括ると誤解する
正確には「入室用の SUM」と「退室用の SUM」を引き算する二段構成です。 - GROUP BY を見落としてウインドウ関数を考えてしまう
本問は単純集計で十分であり、ウインドウ関数は不要です。
FAQ
Q: COUNT と CASE WHEN の組み合わせでも実現できますか?
A: CASE WHEN の中を1/NULLとして COUNT する方法もありますが、試験では典型解と一致させる必要があるため、SUM を使った表現が最適です。
A: CASE WHEN の中を1/NULLとして COUNT する方法もありますが、試験では典型解と一致させる必要があるため、SUM を使った表現が最適です。
Q: 退室区分が 'O' である理由は?
A: 【問題文】「入退室区分には入室('I')又は退室('O')を設定する」と定義されており、英字 'O' が退室を示すコードです。
A: 【問題文】「入退室区分には入室('I')又は退室('O')を設定する」と定義されており、英字 'O' が退室を示すコードです。
Q: REPEATABLE READが指定されているのはなぜですか?
A: 在席者数や所在情報を更新するバッチ処理中に新規ログが追加されても、一貫したスナップショットで集計できるようにするためです。
A: 在席者数や所在情報を更新するバッチ処理中に新規ログが追加されても、一貫したスナップショットで集計できるようにするためです。
関連キーワード: SQL集約関数、CASE式、差分集計、排他制御、トランザクション分離レベル
設問1:〔所在情報管理機能の追加〕について答えよ。
問題文を見る(2)所在情報更新処理を実行中に、入退室ログ登録処理が発生するとデッドロックとなる可能性がある。 デッドロックを引き起こすロックの状況について、時系列に、対象となるテーブルのテーブル名、ロックを掛けるトランザクション、ロック種別、ロック状態を答えて、次に示す表2を完成させよ。
なお、ロックを掛けるトランザクション、ロック種別 ロック状態については、表中の該当する方を○で囲んで示せ。 (時系列3と4は順不同)


模範解答

解説
解答の導き方
設問が問うのは、所在情報更新処理(以下、所在更新)と入退室ログ登録処理(以下、ログ登録)が同時に動いたときに、どのテーブルでどのトランザクションがどの種類のロックを取り、どの時点で待ちが発生してデッドロックになるかを時系列で示すことです。以下は問題文(図2、図3、表1)の記述から論理的に導く手順です。
- ロックと探索方式の前提
- 問題文に「ロックは行単位で掛ける。」とあるため、ロックは行ごとに付与されると考えます。共有ロックは他のトランザクションの共有ロックを許容しますが、専有ロックは共有ロック・専有ロックの取得を妨げます(排他性の説明)。
- 「索引探索の場合、索引から読み込んだ行だけをロックの対象とする。」とあること、そして図1で入退室ログのログIDが主キーで「主索引が定義されている」ので、ログIDによる検索(SQL2, SQL4等)は索引探索になり、入退室ログの読み取りは読み込んだ行だけに共有ロックが付くと判断します。
- 各処理がいつどのテーブルにアクセスしどのロックを取るか(図3・表1・図2の記述より)
- 所在更新(図3)では、SQL2で入退室ログを読み、結果行ごとにホスト変数をセットしてSQL3を実行する。SQL3は
UPDATE エリア状況 SET 在席者数 = 在席者数 + :HDIFF WHERE エリアコード = :HAREACODE
であり、これは該当エリアの行に対する専有(排他)ロックを取得して更新します。その後、SQL4→SQL5→SQL6により、従業員ごとに入退室ログを参照してSQL6を実行します。SQL6は
UPDATE 所在情報 SET 最終入室エリアコード = :HAREACODE WHERE 従業員番号 = :HEMPLOYEEID
であり、所在情報の該当従業員行に対して専有ロックを取得します。所在更新のトランザクション分離レベルは「トランザクションのISOLATIONレベルはREPEATABLE READとする。」とあるため、共有ロック・専有ロックはコミットまで保持される想定です。 - ログ登録(図2)では、まず「① 入退室ログを挿入する。」(INSERT により挿入行に専有ロックを取得しコミットまで保持)し、入室の場合は次に「② …当該従業員の所在情報を参照」して所在情報を読み(共有ロックを取得)、さらに「③ 当該エリアの在席者数と混雑判定閾値を参照」してエリア状況を読み(共有ロックを取得)します。これらの参照は図2 の順序で行われます。
- デッドロックが起きる典型的な時系列(相互待ちの発生)
- 所在更新がSQL2 → SQL3を実行して、あるエリアのエリア状況行に対して先に専有ロック(更新ロック)を取得する(時系列1)。この時点でそのエリアの行は所在更新がロック済み。
- その直後にログ登録が始まり、INSERT を行った後に所在情報を参照して該当従業員の所在情報行に共有ロックを取得する(時系列2)。この共有ロックはコミットまで保持される。
- 続いてログ登録がエリア状況を参照しようとすると、所在更新がすでに当該エリア状況行を専有ロックで保持しているため、ログ登録はそのエリア状況行の共有ロック取得で待ち(時系列3:ロック解除待ち)になる。
- 一方、所在更新はSQL4~SQL6の処理で該当従業員の所在情報行を更新しようとし、そこに対して専有ロックを取得しようとするが、ログ登録が既にその所在情報行に共有ロックを持っているため、所在更新は所在情報行の専有ロック取得で待ち(時系列4:ロック解除待ち)になる。
- ここでログ登録はエリア状況の解除を待ち、所在更新は所在情報の解除を待つため相互待ち(デッドロック)になります。時系列3と4の順序は問題文に「時系列3と4は順不同」とあるとおり入れ替わる可能性がありますが、重要なのはエリア状況と所在情報で互いに相手のロックを待つ循環待ちが発生する点です。
- 以上を表現した時系列ごとの選択(表2の完成)
次の表は設問の選択肢に合わせて、どちらに丸を付けるかを示したものです。選択は(○)で示します。
-
時系列1
- テーブル名:エリア状況
- ロックを掛けるトランザクション:所在情報更新(○) 入退室ログ登録( )
- ロック種別:共有ロック( ) 専有ロック(○)
- ロック状態:ロック済み(○) ロック解除待ち( )
-
時系列2
- テーブル名:所在情報
- ロックを掛けるトランザクション:所在情報更新( ) 入退室ログ登録(○)
- ロック種別:共有ロック(○) 専有ロック( )
- ロック状態:ロック済み(○) ロック解除待ち( )
-
時系列3(時系列4と順不同)
- テーブル名:エリア状況
- ロックを掛けるトランザクション:所在情報更新( ) 入退室ログ登録(○)
- ロック種別:共有ロック(○) 専有ロック( )
- ロック状態:ロック済み( ) ロック解除待ち(○)
-
時系列4(時系列3と順不同)
- テーブル名:所在情報
- ロックを掛けるトランザクション:所在情報更新(○) 入退室ログ登録( )
- ロック種別:共有ロック( ) 専有ロック(○)
- ロック状態:ロック済み( ) ロック解除待ち(○)
(補足)INSERT による入退室ログの新規行は専有ロックを取得しますが、今回のデッドロックの本質は「所在更新が先にエリア状況を専有ロックで更新し、その後所在情報の更新で専有ロックを取りに行く一方、ログ登録が所在情報を参照して共有ロックを取り、次にエリア状況の参照で共有ロックを得ようとして待つ」という相互のロック取得順序の逆転による循環待ちです。
誤りやすいポイント
- SQL3 が UPDATE である点を見落として共有ロックにする誤り。SQL3 は「UPDATE エリア状況 …」なので該当行に専有ロックを取ります。
- 「SELECT=ロックしない」と考える誤り。問題文のロック規則では読み取りでも共有ロックを取得するので、SELECT による参照は他トランザクションの専有ロックを妨げます。
- 入退室ログの読み取りが全件ロックになると勘違いする誤り。図1のログIDが主キーであること、及び「索引探索の場合、索引から読み込んだ行だけをロックの対象とする。」という記述から、範囲検索は索引探索になり読み込んだ行だけがロックされると判断すべきです。
- 時系列3と4の順序は固定ではない点を見落とし、順序に依存した説明をしてしまう誤り。
FAQ
Q: なぜログ登録側が所在情報に共有ロックを持つのですか?
A: 図2の処理で「② …当該従業員の所在情報を参照」とあるためログ登録は所在情報行を読みます。問題文のロック規則に従えば読み取りで共有ロックを取得し、REPEATABLE READのためコミットまで保持され得ます。
A: 図2の処理で「② …当該従業員の所在情報を参照」とあるためログ登録は所在情報行を読みます。問題文のロック規則に従えば読み取りで共有ロックを取得し、REPEATABLE READのためコミットまで保持され得ます。
Q: 入退室ログのINSERT が新行の専有ロックを取るのに、どうして所在更新は入退室ログのロックで待たないのですか?
A: 所在更新はSQL1で最大ログIDを取得し(その時点の範囲を確定)、SQL2/SQL4はその範囲内を索引探索で読むため、通常は新規に挿入された行(ログ登録が作る行)は所在更新が読み込む対象外です。したがって今回のデッドロックの主因は入退室ログの行ロックではなく、エリア状況と所在情報に対するロックの取得順序の逆転です。
A: 所在更新はSQL1で最大ログIDを取得し(その時点の範囲を確定)、SQL2/SQL4はその範囲内を索引探索で読むため、通常は新規に挿入された行(ログ登録が作る行)は所在更新が読み込む対象外です。したがって今回のデッドロックの主因は入退室ログの行ロックではなく、エリア状況と所在情報に対するロックの取得順序の逆転です。
Q: 回避策はありますか?
A: 根本はロック取得順序の不一致なので、両処理で同じ順序でロックを取得する(例えば常に所在情報→エリア状況の順でロックする)、所在更新側で更新箇所の取得を従業員順やエリア順で安定化する、あるいは短期間しかロックを保持しない分離レベルや楽観的制御(バージョンチェック)を採る、といった対策が有効です。
A: 根本はロック取得順序の不一致なので、両処理で同じ順序でロックを取得する(例えば常に所在情報→エリア状況の順でロックする)、所在更新側で更新箇所の取得を従業員順やエリア順で安定化する、あるいは短期間しかロックを保持しない分離レベルや楽観的制御(バージョンチェック)を採る、といった対策が有効です。
関連キーワード: 行単位ロック、共有ロック、専有ロック、デッドロック、インデックス探索
設問1:〔所在情報管理機能の追加〕について答えよ。
問題文を見る(3)(2)のデッドロックを回避するために、図2の入退室ログ登録処理の処理順序を変更する。 変更内容を、図2中の ①〜③を用いて20字以内で答えよ。
模範解答
②と③の処理順序を入れ替える。
解説
解答の論理構成
- 【問題文】で「ロックは行単位で掛ける。」とあり、各処理が取得するロックは実行順に従います。
- 図2の
- ② … “所在情報”系の行にアクセス
- ③ … “エリア状況”系の行にアクセス
と二種類の表を操作します。
- トランザクションAが ②→③、トランザクションBが ③→② の順で実行すると、Aは“所在情報”をロック中に“エリア状況”のロック待ち、Bはその逆となり「お互いにロック解放待ち」の状態=デッドロックになります。
- 双方の取得順序を「③→②」に合わせれば循環待ちは起こりません。
- よって「②と③の処理順序を入れ替える。」が最小変更での解決策となります。
誤りやすいポイント
- ①を最後に回すなど大幅な並べ替えを検討してしまう
- ロックレベル(共有/専有)の違いだけでデッドロックが起こると誤解する
- 順序を逆にするのではなく“同時実行しない”よう排他制御を強化すると性能を大きく下げてしまう
FAQ
Q: 順序をそろえてもロック待ち時間はゼロになりますか?
A: ゼロにはなりません。待ちは発生しますが、循環待ちがなくなるためタイムアウトやロールバックが不要になります。
A: ゼロにはなりません。待ちは発生しますが、循環待ちがなくなるためタイムアウトやロールバックが不要になります。
Q: トランザクションのISOLATIONレベルを変更しても解決できますか?
A: 本設問ではロック順序の不統一が原因なので、ISOLATIONレベルを変更しても根本的なデッドロックは解消されません。
A: 本設問ではロック順序の不統一が原因なので、ISOLATIONレベルを変更しても根本的なデッドロックは解消されません。
関連キーワード: デッドロック、行ロック、排他制御、トランザクション、ロック順序
設問2:〔監査機能の追加〕について答えよ。
問題文を見る(1)図5中の(e)〜(h)に入れる適切な字句を答えよ。
模範解答
e::HTARGETID
f::HENDID
g:IS NULL
h:従業員番号
解説
解答の論理構成
-
HTARGETIDとHENDIDの役割
- 【問題文】②‐1では「① の HBEGINIDをHTARGETID に設定」と記載。
- 再開時は②‐2で「その 再開従業員番号をHTARGETID に設定」。
- よって、カーソル開始位置 (e) は :HTARGETID。
- ①で設定した終了番号 HENDID が最終位置なので (f) は :HENDID。
-
監査対象行の絞込み
- 要件 (2) に「監査未チェックの勤怠を対象」とあり、未チェックはNULLと規定。
- したがって (g) には IS NULL を入れ、= 'Y' や = 'N' を排除。
-
カーソルの並び順
- ⑤で「カーソルから1行読む」→ ⑩で“再開従業員番号”を更新しコミット、N行ごとに①へ戻る。
- 同一従業員の行が連続して処理されないと ⑤~⑩ の意味が崩れるため、最優先キーは 従業員番号。
- よって (h) は 従業員番号。
誤りやすいポイント
- 「監査結果は 'Y'/'N' もあるから <> 'Y' を書く」と勘違いし NULL判定を忘れる。
- 再開処理 = フルスキャンと誤認し、(e) に HBEGINID を入れてしまう。
- ORDER句に年月日だけを書き、従業員番号でまとまらない不安定なカーソル順序を作る。
FAQ
Q: BETWEEN :HTARGETID AND :HENDIDでは範囲が変わるたびにパラメータを変える必要がありますか?
A: はい。再開時は②‐2で取得した HTARGETID をセットし直してからカーソルを開きます。
A: はい。再開時は②‐2で取得した HTARGETID をセットし直してからカーソルを開きます。
Q: IS NULLだとインデックスが使われにくいのでは?
A: 多くのRDBMSでNULL値も索引に含められる設定が可能です。本問題では索引有無より 論理正当性 の説明が主眼です。
A: 多くのRDBMSでNULL値も索引に含められる設定が可能です。本問題では索引有無より 論理正当性 の説明が主眼です。
Q: ORDER句で複合キー全体を指定しないとロック順序が不安定になりませんか?
A: 主要キーを 従業員番号、年月日 の順に指定しているため、監査処理が必要とする従業員単位の安定順序は確保できます。
A: 主要キーを 従業員番号、年月日 の順に指定しているため、監査処理が必要とする従業員単位の安定順序は確保できます。
関連キーワード: BETWEEN句、NULL判定、カーソル処理、排他ロック、READ COMMITTED
設問2:〔監査機能の追加〕について答えよ。
問題文を見る(2)図5中の(ア)で行うべき処理を40字以内で答えよ。
模範解答
ア:“再開位置” テーブルからジョブIDがHJOBIDの行を削除する。
解説
解答の論理構成
- ②‐1,②‐2で再開位置を登録・更新
- 【問題文】「“再開位置” テーブルにHJOBIDとHTARGETIDの行を挿入」「…再開従業員番号をHTARGETIDに設定する」
- ⑤〜⑩のループ中に逐次更新
- 【問題文】「⑩ “再開位置” テーブルの当該ジョブの再開従業員番号を…更新し、コミットする」
- ジョブが最後まで正常終了した場合は再開位置が不要
- 再開用行が残ると②起動時に誤って②‐2へ進み、処理範囲がスキップされる危険がある。
- よって終了直前の(ア)で削除
- 「削除」することで②起動時に②‐1が選択され、次回は冒頭から新たに行を挿入するフローが成立。
- したがって回答は「“再開位置” テーブルからジョブIDがHJOBIDの行を削除する」となる。
誤りやすいポイント
- 更新済みの再開位置をNULLへ更新すると考えてしまう。NULLを設定しても②‐2で行が存在する限り誤判定になります。
- トランザクションレベルREAD COMMITTEDなので削除は不要と誤解する。再開判定は物理行の有無で行うため、コミット後も行が残ればロジック破綻を招きます。
- WITH HOLDカーソルがあるためカーソル終了時に自動クローズすれば十分と思い込み、再開位置削除を忘れる。
FAQ
Q: ジョブが異常終了した場合、削除してしまうと再開できませんか?
A: 異常終了時は⑫まで到達せず削除が行われないため、行は残ります。再実行時は②‐2で再開できます。
A: 異常終了時は⑫まで到達せず削除が行われないため、行は残ります。再実行時は②‐2で再開できます。
Q: ジョブIDを再利用するとありますが、削除で問題は起きませんか?
A: 再利用時には②‐1で新たに挿入するため競合しません。完了時に行をクリーンに消しておくことが再利用を安全にします。
A: 再利用時には②‐1で新たに挿入するため競合しません。完了時に行をクリーンに消しておくことが再利用を安全にします。
関連キーワード: 再開処理、排他制御、WITH HOLDカーソル、READ COMMITTED
設問2:〔監査機能の追加〕について答えよ。
問題文を見る(3)AとBの対象となる処理に該当するものを、図5中の④〜⑬から選べ。 なお、該当する処理が複数ある場合は全て選ぶこと。
模範解答
Aの対象となる処理:⑩
Bの対象となる処理:⑤、⑥、⑦、⑧、⑨
解説
解答の論理構成
- 問題は排他ロック待ちのタイムアウトT秒内に処理を終えるため、1回のループで実行する行数Nを算定する式として
『N < ( T - (A)に必要な時間 ) ÷ (B)に必要な時間』
を提示している。 - この式は
- (A):N行ごとに1回だけ走る処理
- (B):1行処理するたびに走る処理
を分離して所要時間を見積もる構造になっている。選択肢の範囲は④〜⑬である。
- 図5の④に「⑩の処理はN行おきにだけ実行する」とある。よって ⑩ が (A)。
- ⑤~⑨ は “カーソルで読む行がある限り繰り返し” 実行される1行ごとの処理である。したがって ⑤、⑥、⑦、⑧、⑨ が (B)。
誤りやすいポイント
- ⑩を1行ごとの処理と誤解する
④に「⑩の処理はN行おきにだけ実行する」と明記されている。 - ①を (A) と答えてしまう
①は選択肢の範囲(④〜⑬)に入っておらず、ループの前に1回だけ実行される処理である。 - ⑤~⑨と⑩の呼び出し頻度を取り違える
“N行おき” と “1行ごと” の差を読み飛ばすと計算式の意味を取り違える。
FAQ
Q: ⑩が (A) になるのはなぜですか?
A: 図5の④に「⑩の処理はN行おきにだけ実行する」とあるからです。N行ごとに1回だけ実行されるので、式の (A) に当たります。
A: 図5の④に「⑩の処理はN行おきにだけ実行する」とあるからです。N行ごとに1回だけ実行されるので、式の (A) に当たります。
Q: ④はループ判定だから (A) では?
A: ④自体は各行処理を開始する判定であり「N行おきにだけ実行する」わけではないため (A) には該当しません。
A: ④自体は各行処理を開始する判定であり「N行おきにだけ実行する」わけではないため (A) には該当しません。
Q: N行の間隔を大きくすれば速くなる?
A: Nを大きくすると ⑩ の回数は減りますが、排他ロック保持時間が長くなり他トランザクションに影響するため、式の範囲内で適切に設定する必要があります。
A: Nを大きくすると ⑩ の回数は減りますが、排他ロック保持時間が長くなり他トランザクションに影響するため、式の範囲内で適切に設定する必要があります。
関連キーワード: トランザクション分離レベル、排他ロック、バッチ処理、パフォーマンスチューニング、サイジング






