トランザクション分離レベル
分離レベルの種類
複数並行に動作するトランザクションそれぞれの結果が、逐次実行した場合と同じ結果になる
同一トランザクション内では最初のreadと結果がトランザクション内で変わらない
レコード数の結果が変わることがある
別のトランザクションでコミット済みの変更を読み取れてしまう
トランザクション内でタイミングによってreadの結果が変わることがある
別トランザクションで未コミットの変更が読み取れてしまう
発生しうる問題
別のトランザクションでコミットされていないデータが見える
別のトランザクションで特定の行を更新/削除したとき、その行の更新/削除が見える
別のトランザクションで特定の行の集合を追加/削除したとき、その結果が見える
複数トランザクションで同じ行に更新をかけたとき、後に更新をかけたトランザクションの結果だけ反映される
ロックの種類
Shared Lock のみ可
Shared/Exclusive Lock どちらも不可
上記の問題を防ぐには (TODO)
トランザクション内で SELECT FOR UPDATEを利用してreadする
whereで指定した行にロックをかける (gap lock, next-key lock をかけることもある)
Serializable のDBMSを使う
Cloud Spanner (正確にはSerializableより強固な External Consistency (= 外部整合性)) rw transaction 内で行ロックを取ってから行を更新する
ref