K-fix Learning & Playing

データベース


DBMSと排他制御

DBMSは、データベース管理のためのソフトウェアで、サーバ上に共有データを置き、クライアントから必要なデータを要求して利用するソフトウェアです。

複数の利用者が同時に同じデータを更新しようとすると、データの矛盾が生じてしまうので、先にデータをアクセスした利用者を優先させ、それ以降の利用者はデータにアクセスできないようにする排他制御という機能を持ちます。

ロック」とは、ある利用者が更新したり参照したりしているデータを、他の利用者が利用できないようにすることでです。
ロックには、更新と参照の両方を許可しない排他(占有)ロックと、更新だけを許可しない共有ロックがあります。

排他制御

ある処理が実行中の時、その処理が対象としているデータをロックし、他の操作(処理)のアクセスを禁止することによって、データの整合性を確保しようとする仕組みです。

排他制御

ロック制御

目的のデータをロックして他のトランザクションが使わないようにすることをロック制御といいます。

共有ロック
同じデータの複数のトランザクションで同時にアクセスすることを許します
参照だけしかしない場合に使用するロックです。
占有ロック
同じデータを複数のトランザクションで同時にアクセスすることを許しません
ロック制御の原理

トランザクションは、データにアクセスするときに共有ロックまたは占有ロックのどちらかをかけることになります。
2つのトランザクションが同じデータに対してロックをかけた場合、自分と相手のロックの組み合わせに応じてお互いのそのデータへのアクセスが制限されます。

先発トランザクションA後発トランザクションBが同じデータに共有ロックと占有ロックをかけた場合の組合わせを表にすると、下のようになります。

ロック制御の原理

表の中でNGとあるのは、相手のトランザクションが終了するまで待つようにするのが一般的。
基本的にロックは早い者勝ちのルールになっています。

ロック粒度

ロック粒度とは、ロックをかける範囲(単位)のことで、ロックが保護するデータの大きさです。

  • 粒度が細かい
      → ロックの競合が少ない
         → 同時実行可能なトランザクションが増える
  • 粒度が粗い
      → ロックの競合が多い
         → 同時実行可能なトランザクションが減る

デッドロック

2つ以上のスレッドあるいはプロセスなどの処理単位が互いの処理終了を待ち、結果としてどの処理も先に進めなくなってしまうことを「デッドロック」といいます。

デッドロック