skillup

技術ブログ

Database

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

投稿日:

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

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

ロックについての方針

楽観的ロック

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

メリデメを上げると

メリット

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

デメリット

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

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

悲観的ロック

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

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

メリット

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

デメリット

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

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

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

ロックの種類

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

共有ロック

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

占有ロック

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

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

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

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

-Database

執筆者:


comment

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

関連記事

no image

HAVING句について NULL時の動き

HAVING句のNULLがあった時の挙動にたいしてメモリます。 COUNTの処理 対象上の列数を数えるのにCOUNTを使うと思いますが、COUNT(*)とCOUNT(列名)では動きが若干違っており、前 …

no image

ユニークキーの設定

MySQLでのユニークキーの設定に関して。 ユニークキーの設定は下記の通り。

ユニークキーを作成した後に確認するのは下記コマンドで。 …

no image

フィールド以外のプロパティをエンティティに持たせる

JPAでは基本的に1テーブル、1クラスです。 このためプロパティは必然的にテーブルのフィールドに対応しています。 ただ、必ずしもプロパティだけでなく、臨時で持たせておきたい、プロパティがあったりします …

no image

アンチパターン トランザクションスコープ+大量データのリアルタイム集計+接続が詰まる

本日は主にインフラの設計的なことに関して。 Contents1 トランザクションスコープの設定1.1 デメリット1.2 対策2 大量データのリアルタイム集計2.1 デメリット2.2 対策3 詰まると接 …

no image

SQLにおけるナンバリング

本日はナンバリングに関して。 MySQLを使っていますと各テーブルにはid int not null auto_increment primary keyなどと打って主キーを打つことがほぼ習慣になって …

アーカイブ