skillup

技術ブログ

Database

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

投稿日:

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

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

ロックについての方針

楽観的ロック

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

メリデメを上げると

メリット

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

デメリット

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

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

悲観的ロック

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

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

メリット

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

デメリット

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

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

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

ロックの種類

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

共有ロック

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

占有ロック

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

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

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

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

-Database

執筆者:


comment

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

関連記事

no image

SQLのチューニングに関して

ここ2か月ぐらいはSQLの本でがりがり勉強してきましたね。当然復習も必要かと思いますが、だいぶいろんなことを覚えたなあという気がします。 一番勉強になった本はもちろん「達人に学ぶ SQL徹底指南書」と …

no image

MySQLのLIMIT,OFFSETに関して&explainの見方など

自作のWEBアプリを作っていたところSELECT句が異常に遅いケースがありました。 発見までにかなり時間がかかったんですが、不可思議な現象としてはOFFSETが小さいときと大きいときで検索スピードが全 …

no image

NoSQLについて

NoSQLについて。 現在の案件ではmongoDB(NoSQL)を使っていますが、NoSQL自体が始めてだったので、これを機に少し掘り下げてみようとおもいます。 Contents1 NoSQLとは?2 …

no image

SQL基礎 条件式はunionよりもcaseで

複雑な条件式があったときにcase式を使うことでパフォーマンスを向上させることができます。 ※一般にunionを使うよりも高速なことが多い。 例1 ある条件により別の列を使いたいとき、 [crayon …

no image

MySQLでのlocalhostと127.0.0.1の違い

たまにMySQLでローカルのホストに接続する時に、localhostで接続するときと127.0.0.1で接続するときで挙動が違う(片方だとエラーになり、もう片方だとエラーにならない)などがあるのでちょ …

アーカイブ