aono1234
@aono1234

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

デッドロックに関して

デッドロックに関して

現在、SQLについて書籍で勉強をしております。
その中でデッドロックという現象について取り上げられておりました。
現象のメカニズムは理解できるのですが、
自分の理解と食い違っている点をデッドロックを通して気づきました。

違和感を覚えた点

書籍ではトランザクションが2つ同時に発生した場合に参照先がロックされて
にっちもさっちもいかない状態であると書かれておりました。

まず、2つ同時に発生することがあるというところが理解できておりません。
自分のイメージではDBサーバーがあり
そのサーバー上にDBMS(データベースマネジメントシステム)があり
DBMSが各ブラウザからのリクエストを受けてデータベースからデータをレスポンスとして返している。というイメージです。

なので同時に別ブラウザから命令が入ってもDBMSが順次実行していくから、
デッドロックのような現象が起こらないのではないかと思っておりました。

私の前提認識が正しくないことはわかっておりますが、どこが正しくないのでしょうか?
・DBMSはデータベース1つにつき1個ではない?
・データベース1個の時は発生せず、データベースが複数あるときにデッドロックは発生する?
・DBMSが順次処理ではなく並列処理をする?。

すみませんが、ご教授いただけると幸いです。

0

4Answer

・DBMSはデータベース1つにつき1個ではない?
→データベース1つにつき対応するDBMSは1つ。
・データベース1個の時は発生せず、データベースが複数あるときにデッドロックは発生する?
→1個の時は発生しないですね。2つ以上の資源にアクセスするときにデッドロックが発生する可能性があります。
・DBMSが順次処理ではなく並列処理をする?
→デッドロックとは関係ない気がしますが並列処理は起こります。

デッドロックについては実際に起きた障害の解説等を見ると理解が深まるかと思います。

1Like

Comments

  1. @aono1234

    Questioner

    ご回答ありがとうございます。参考資料ありがとうございます。デッドロックを軽く考えていましたが多大な損失につながることがあるのですね…気を付けます。

複数の資源があり、かつ、
その資源にアクセスする複数の処理がある場合に発生します。

図示もされており、分かりやすいサイトを
見つけたのでもしよろしければこちらを確認してみてください。
(「デッドロックの具体例」という章を見ていただければイメージしやすいかと思います)

1Like

Comments

  1. @aono1234

    Questioner

    ご回答ありがとうございます。図もあり大変わかりやすかったです!

私の見解です。

  • DBMSはデータベース1つにつき1個ではない?

    • データベース1つにつき、対応するDBMSは一個というのは正しいです。
      が、DBMS上に複数のデータベースを作成することができますので、
      DBMSとデータベースの関係は1対多です。
  • データベース1個の時は発生せず、データベースが複数あるときにデッドロックは発生する?

    • ロックはテーブルごと、行ごとに発生するので
      データベース1個でも発生します。
      データベースが複数ある時も当然発生します。
  • DBMSが順次処理ではなく並列処理をする?。

    • 基本的にDBMSは並列処理をしています。

以上が、私の見解なのですが、
他の方と言葉の定義が異なる場合、混乱させてしまうかもしれません。
私は、

  • リレーショナルデータベースを念頭に置いてまして、
  • DBMSはMSSQL,Oracleなどのミドルウェアとしており、
  • DBMS上に作成するデータの塊を「データベース」、
  • データベース上に作成する表を「テーブル」、
  • テーブル上に作成するデータを「行」
    としています。
1Like

Comments

  1. @aono1234

    Questioner

    ピンポイントにご回答頂きありがとうございます。データベースの数などは関係ないという回答で一気にトラブルシューティングがしやすくなりました。ありがとうございます。

・データベース1個の時は発生せず、データベースが複数あるときにデッドロックは発生する?

データベースの個数は関係ないと思います。
データベース全体にロックがかかるわけではなく、テーブルや行単位でロックされるので。

2つ同時に発生することがあるというところが理解できておりません。

トランザクションというのは複数の処理が集まったものです。

  1. DBの○○データを参照(ロックをかける)
  2. 何かの処理1
  3. 何かの処理2
  4. DBの△△データを更新
  5. トランザクション終了(ロックを解除)

例えばこのようなトランザクションの間に別のトランザクションが実行されるイメージです。

1Like

Comments

  1. @aono1234

    Questioner

    ご回答ありがとうございます。トランザクションについてなんとなくの理解でしたのでフローを示して頂き大変わかりやすかったです。ありがとうございます。

Your answer might help someone💌