マナビング基本情報技術者

ロックの粒度を大きくすると何が変わるのか

基本情報技術者試験 平成30年度秋期 午前 問29 / データベース › トランザクション処理

過去問にチャレンジ

平成30年度秋期 午前 問29

ロックの粒度に関する説明のうち,適切なものはどれか。

  1. ア

    データを更新するときに,粒度を大きくすると,他のトランザクションの待ちが多くなり,全体のスループットが低下する。

  2. イ

    同一のデータを更新するトランザクション数が多いときに,粒度を大きくすると,同時実行できるトランザクション数が増える。

  3. ウ

    表の全データを参照するときに,粒度を大きくすると,他のトランザクションのデータ参照を妨げないようにできる。

  4. エ

    粒度を大きくすると,含まれるデータ数が多くなるので,一つのトランザクションでかけるロックの個数が多くなる。

会話形式の解説

講師講師
この問題では、ロックの粒度、つまり一度にロックする範囲の大きさに注目します。範囲を広げると、ほかの処理の待ちとロックの個数はどう変わりますか。
受験者受験者
一度に広い範囲を押さえるなら、ロックの個数は減りそうです。ただ、待ちが増える理由を確認したいです。
講師講師
更新するデータ以外までロックの範囲に入ると、その範囲を使いたいほかのトランザクションも解除を待つことになります。
受験者受験者
すると、同時に進める処理が減ります。全体のスループットが下がるという説明が適切ですね。
講師講師
はい。同じデータを更新するトランザクションが多い場合も、粒度を大きくすれば同時実行できる数が増える、とはいえません。ロックの範囲が広がり、待つ場面が増えます。
受験者受験者
表の全データを参照する場合はどうでしょう。粒度を大きくすると、ほかの参照を妨げなくなるようにも見えます。
講師講師
参照どうしが両立するのは共有ロックの性質です。粒度を大きくした効果ではありません。範囲を広げると、ほかの更新を止める範囲はむしろ広がります。
受験者受験者
参照どうしが両立するかは、ロックの範囲ではなく種類で判断するのですね。
講師講師
そのとおりです。では、粒度を大きくすると、一つのトランザクションでかけるロックの個数は増えますか。
受験者受験者
いいえ。同じ範囲を扱うなら減ります。表の全行を扱う場合、行単位では行ごとに必要でも、表単位なら一つで済みます。
講師講師
整理できましたね。粒度を大きくすると待ちが増える一方、必要なロックの個数は減ります。粒度を小さくすると、この関係は逆になり、ロック管理の負荷も増えます。

まとめ

適切なのはアです。ロックの粒度を大きくすると、更新対象以外も含む広い範囲がロックされ、ほかのトランザクションの待ちが増えてスループットが下がります。同じ範囲に必要なロックの個数は減るので、エの説明は逆です。参照どうしが両立するのは共有ロックの性質であり、粒度を大きくした効果ではありません。

解答・解説

正解はアです

この問題のテーマ

データベースの排他制御で、ロックの粒度(ロックをかける単位の大きさ)を変えると、待ち・同時実行性・ロックの個数がどう変わるかを問う問題です。

解き方の考え方

ロックの粒度は、データベース、表、ページ、行など、1回のロックで押さえる範囲の単位です。粒度を大きくすると1つのロックが広い範囲を覆うので、①ほかのトランザクションとぶつかりやすくなり、②同じ範囲なら少ない個数のロックで済みます。各選択肢の「粒度を大きくすると」の後に書かれた結果が、①と②のどちらとも矛盾しないかを確かめます。

選択肢ごとの解説

  1. ○ア  データを更新するときに,粒度を大きくすると,他のトランザクションの待ちが多くなり,全体のスループットが低下する。
    更新するときのロックの粒度を大きくすると、実際に書き換えるデータ以外も含む広い範囲がロックされます。その範囲を使いたいほかのトランザクションはロックが解除されるまで待つことになり、待ちが増えます。待ちが増えれば同時に進む処理が減るので、全体のスループットが下がるという記述は正しいです。
  2. ×イ  同一のデータを更新するトランザクション数が多いときに,粒度を大きくすると,同時実行できるトランザクション数が増える。
    同時実行できるトランザクション数が増えるという記述は、粒度を大きくしたときの結果と逆です。ロック範囲が広がると、ほかのトランザクションがロックの解除を待つ場面が増えます。同じデータを更新するトランザクションが多い状況なら競合はさらに起きやすくなるため、同時に実行できる数は減ります。
  3. ×ウ  表の全データを参照するときに,粒度を大きくすると,他のトランザクションのデータ参照を妨げないようにできる。
    参照のときにかける共有ロックは、ほかのトランザクションの参照とは両立します。そのため、ほかの参照を妨げないのは共有ロックの性質によるもので、粒度を大きくしたからではありません。粒度を大きくすると表全体がロックの範囲に入り、むしろほかのトランザクションの更新を止める範囲が広がります。
  4. ×エ  粒度を大きくすると,含まれるデータ数が多くなるので,一つのトランザクションでかけるロックの個数が多くなる。
    粒度を大きくすると1つのロックが覆うデータ数は増えます。そのため、同じ範囲を扱うのに必要なロックの個数は「多くなる」のではなく少なくなります。たとえば表の全行を扱う場合、行単位なら行の数だけロックが必要ですが、表単位なら1つで済みます。

補足

粒度は並行性と管理の負荷のどちらを優先するかのトレードオフです。「大きい=待ちが多い・ロックは少ない」「小さい=待ちが少ない・ロックは多い」と対にして覚えると、選択肢の向きの誤りに気づきやすくなります。参照どうしが両立するかどうかは、粒度ではなくロックの種類(共有ロックか専有ロックか)で決まる点も区別しておきましょう。

POINT

  • ロックの粒度は1回のロックで押さえる範囲の単位で、データベース、表、ページ、行などがあります。
  • 粒度を大きくすると待ちが増えて並行性が下がり、スループットが低下します。
  • 粒度を大きくすると、同じ範囲を扱うのに必要なロックの個数は減り、ロック管理の負荷は軽くなります。
  • 粒度を小さくすると並行性は上がりますが、ロックの個数が増えて管理の負荷が大きくなります。

※出典:平成30年度秋期 基本情報技術者試験 午前 問29