skillup

技術ブログ

Database

ロック(排他制御)について

投稿日:

ECなどでの開発の場合、当然在庫数によって購入できるか、いなかがかわってきますが、複数人で同時にアクセスする際、処理の整合性を見る必要がでてきますので、ロックのが概念が大事になってきます。

そこでロック処理についてまとめてみようかなと。

ロックについての方針

楽観的ロック

ロックを考える際に、一番簡単なのはバージョンみたいなカラムを用意しておき、処理開始〜更新までにバージョンが更新されていないことを確認して、問題なければ更新処理を行う、といったような処理です。

メリデメを上げると

メリット

  • 処理の方法として簡便
  • 他の処理をロックしないのでパフォーマンスへの影響が少ない

デメリット

  • 競合が発生する可能性を許可してしまう

比較的短時間の処理で使われることが多いと思います。

悲観的ロック

こちらは物理的にDB側で制御してしまうのですが、ある処理が開始して終了するまでは一定の処理(更新onlyのこともあれば参照、更新ともに不可)を行えないようにしてしまう方法です。

参照系などでも在庫の数量を確認する場合、在庫が1つしかないときに、2人の人が同一のタイミングでアクセスされると制御していないと2人とも購入ができてしまいます。

メリット

  • 物理的にDBにロックをかけてしまうので、処理の不整合が起きない

デメリット

  • 他の処理がブロックされてしまい、その間、一定期間の処理ができないため、パフォーマンスに影響がでる

こちらは比較的長めの重めの処理で使われることが多いかと思います。

排他制御(楽観ロック・悲観ロック)の基礎

ロックの種類

悲観的ロックの際に物理的にDBに制約をかけますが、許可する一定のロックの処理にも種類があります。

共有ロック

処理がおわる(トランザクションの開始から終了)まで、参照はOKだが、更新はNGのような場合です。

占有ロック

読み取りも更新も一切NGにするケースで在庫処理のような場合はこちらを使うのが良いと思われます。

ただしDBの制御によってかわってきたりするので、占有ロックをしても参照できてしまうことなどもあるようです。

リンク
DBのロックについてあまり意識したことがない人に向けた実は覚えておきたいロックについての知識

データベースのロックの基礎からデッドロックまで

-Database

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

論理設計のアンチパターン その2

今回は論理設計のアンチパターンの続きです。 今までに比べると何も意図がないというものではなく、パフォーマンスを考えて設計されているようなものが多いです。 ただし、中には絶対に許されないタイプのものもあ …

no image

データベース設計のアンチパターン 重すぎるOLTP+Date型不統一+データ量想定が甘い

Contents1 重すぎるOLTP1.1 デメリット1.2 対策2 DATE型の型の不統一2.1 デメリット2.2 対策3 データ量の想定が甘い3.1 デメリット3.2 対策 重すぎるOLTP ※O …

no image

第二、第三の正規化&ER図&Check制約

前回第一正規化を話したので、第二、第三に進んでいきます。 Contents1 第二正規化とは?2 第三正規化とは?3 正規化のメリット4 ER図5 本日のSQLネタ Check制約 第二正規化とは? …

no image

複数GROUP BYでの注意

GROUP BYしたときに件数が増えるという現象があったので一応メモ。というか当たり前のことですが・・・ たとえば以下のようなテーブルがあったとします。 student id student_name …

no image

CASE式のすすめ その2

本日も「達人に学ぶSQL徹底指南書」を地道に進めていきます。 Contents1 CASE式の利用2 UPDATE文のCASE3 テーブル同士のマッチング CASE式の利用 私自身はCHECK制約を使 …

アーカイブ