skillup

技術ブログ

Database

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

投稿日:

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

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

ロックについての方針

楽観的ロック

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

メリデメを上げると

メリット

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

デメリット

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

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

悲観的ロック

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

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

メリット

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

デメリット

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

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

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

ロックの種類

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

共有ロック

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

占有ロック

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

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

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

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

-Database

執筆者:


comment

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

関連記事

no image

DBの基礎 テーブルとは

CSSを学習したあとはデータベースの学習などを。 参考図書:「達人に学ぶDB設計指南書」基本的にはこれを読んでいきます。が、現状よくわからないところは飛ばしていきます・・・ Contents1 テーブ …

no image

laravelのmigrationに関して

DBのカラムの保守などをする場合のmigrationに関して。 ポツポツ使っていたのですが、しっかりまとめてなかったのでここでまとめて見ようかと思います。 Contents1 カラム定義2 実際の実行 …

no image

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

今回からは論理設計のアンチパターンについて。 やってはいけない設計のパターンですね。これはまわりがやっていると気づかずにやっている可能性があるのでしっかりメモしておきたいです。 Contents1 非 …

no image

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

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

no image

正規化のデメリット

Contents1 正規化のデメリット2 本日のSQL 正規化のデメリット 正規化についていろいろ書いてきましたが、メリットもあればデメリットもあります。 メリットとしては データの不整合が起きにくい …

アーカイブ