公開日:11/23/2022 更新日:11/23/2022
自分が学んだDBのロック周りの知識について忘れないように記録しておく。
1.排他ロック
2.共有ロック
例として、INSERT...SELECT や CREATE TABLE ... AS SELECT などの、SELECT結果をもとに追加・更新が発生するSQLでは共有ロックが取得されている。
1.表ロック
2.行ロック
デッドロックとは、複数のトランザクションがもう一方の処理が終わるのをお互い待って身動きが取れなくなっている状態を指す。
PostgresSQLは特徴として、SELECT時に「AccessShareLock」という一番小さなレベルのロックをとる。「AccessShareLock」は、LOCK TABLE 実行時に取得するロック「ACESS EXECLUSIVE」とコンフリクトするためデッドロックが発生する。MySQLは LOCK TABLE 以前のトランザクションを暗黙的にコミットするため、上記のデッドロックは発生しない。
MySQLの特徴として、対象が存在しなくてもINDEX値のギャップに基づいて発生するギャップロック、対象よりも1つ先の行までロックを取るネクストキーロックがある。
トランザクション分離レベルは以下の4レベルに分けられる。下に行くほど並列度が低くなり直列処理となる。上に行くほど処理は早くなるが、ACID特性のIsolation (分離性、独立性) が犠牲となる。
ダーティーリード | ファジーリード | ファントムリード | ロストアップデート | |
---|---|---|---|---|
read uncommitted | 発生 | 発生 | 発生 | 発生 |
read committed | 起きない | 発生 | 発生 | 発生 |
repeatable read | 起きない | 起きない | 発生 | 発生 |
serializable | 起きない | 起きない | 起きない | 起きない |
他のトランザクションから自分のコミットしていない変更内容が見えてしまう現象。データ整合性が重要な場面では致命的な現象。避けなければいけない。
別名はノンリピータブルリード。他のトランザクションがコミットしたデータが、自分のトランザクション中に見えてしまう現象。並列処理の場面で意識する必要がある。PostgresSQL はデフォルトがread committed のため意識する必要がある。
他のトランザクションがコミットした追加、削除が見えてしまう現象。
複数のトランザクションで更新が並列に行われた場合、あとに実行されたトランザクションで結果が上書きされる現象。
失敗から学ぶRDBの正しい歩き方 第13章 曽根壮大