update.メモ開放。InnoDBの行ロック関連について、それぞれの項目が必ずしも並列関係にあるわけではないが、以下のようにまとめていく。MODE排他ロックと共有ロック読み取りを許すかどうかの違い。排他ロックは対象行を全てのクエリからロックするため、UPDATEやDELETEなどの更新クエリはもちろん、SELECTなどの読み取りクエリも通さない。共有ロックは更新クエリを通さないが、読み取りクエリは通す。(追記:排他ロックは分離レベルによってはSELECTを通すとのこと。)排他ロックは全てのクエリを通さず、共有ロックは排他ロックを伴うクエリを通さない、と言い換えたほうがいいかもしれない。公式では共有ロックは同トランザクション内のselectを許し、排他ロックは同トランザクション内のupdateとdeleteを許すとあるが、共有ロックが同トランザクションのupdateやdeleteを許さないわけではないし、排他ロックが同トランザクションのselectを許さないわけではない。INSERTは対象行に排他ロックをかけるが、重複キーエラーが起きた時は対象行に共有ロックをかける。IGNOREの場合も同じ。既存レコードに共有ロックをかけ、別トランザクションがその行に排他ロックをかけようとすると待機状態になる。この時、最初のトランザクション内で同じレコードに排他ロックをかけようとするとデッドロックになる。これは、別トランザクションでロック待機が存在していると、既に取得している共有ロックを排他ロックにアップグレードできず、待機状態になってしまうためである。これが共有ロックであるならばアップグレードは必要ないので、デッドロックは起きない。UPDATE排他ロックの一種。取得した値を利用して更新をかける際に使われることを想定しており、全てのクエリを通さない。既存レコードに排他ロックをかけ合うことはできないが、固有値検索条件として存在しないレコードを指定するとギャップロックになる。updateをかけ合うことができるが、insertの挿入インテンションギャップロックと競合するので、その箇所にinsertをすることは許さない。MODE共有ロックの一種。UPDATEも通さない。MODE同士のような、共有ロックを伴うクエリは通す。#Tx2共有ロックしたレコードに別トランザクションが共有ロックする場合、ロックは共存する。#Tx1ここでTx2が排他ロックをかけた場合、デッドロックになる。対象レコードが存在しない場合はギャップロックがかかり、ギャップロック同士は競合しないが、insertの挿入インテンションギャップロックと競合するので、insertは通らない。Kio@mizzwithliamサービス設計とUIデザインを主にやっています。フロントエンド中心にコード書くこともあります。upLoginユーザーは見つかりませんでした。