Open yagikota opened 1 month ago
トランザクション
トランザクションの特徴=ACID特性
ACID
→DBごとに定義が異なるので、ほぼマーケティング用語と化している。
Atomicity
事前にロギングを行う仕組みは全てWALと呼ばれる。MySQLで言えばInnoDBにおいてRedoログとして利用されるログもWALであるし、MySQL Clusterのディスクテーブル利用時のUndoログだってWALの一種である。現在開発中のストレージエンジンであるFalconやMaria(MyISAMにクラッシュリカバリやトランザクション機能をつけたもの)もWALを搭載する予定である。もちろんOracleやPostgreSQLなど他のRDBMSでもWALが搭載されている。 用途、つまりRedoなのかUndoなのかということに因らず、実データに更新を行う前にログに書き込む方式をWALというわけである。 WALがあれば、チェックポイント処理(どこまでデータファイルに書き込んだのかということを記録する処理)と組み合わせることで、万が一の障害時に役に立つ。
Consistency
Isolation
Durability
単一オブジェクトレベルでのAtomicityとIsolationは必要
中断されたトランザクションのエラー処理は完璧ではない
https://christina04.hatenablog.com/entry/transaction-isolation-level
Read Committedではこれらが起きない。
Read Committedでも対処できない問題もある。 → read skew
DBのバックアップ時に問題になるらしい。
スナップショット分離(リピータブルリード)
各トランザクションは、トランザクション開始時のスナップショット(一貫性あり)から読み取りを行う
書き込みロックあり(dirty writeを避けるため)
読み込みロックなし
読み取りによる書き込みのブロックなし
書き込みによる読み取りのブロックなし
MVCC(Multi-Version Concurrency Control)で実装
read-modify-writeで問題になる。 UserAのwriteがUserBのwriteに打ち消される。
UPDATE counters SET value = value + 1 WHERE key = 'foo';
であれば防げる。 ORMフレームワーク使うと意図せず、read-modify-writeになることがあるので注意。
アトミックの実現には、読み取り時の排他ロック(cursor stability)orシングルスレッド実行
7.2.4 書き込みスキューとファントム 書き込みスキュー(Write Skew)は、複数のトランザクションが互いに干渉することなく読み取りと書き込みを行い、結果的にシステム全体の整合性が崩れる現象です。これは、特にSerializable以外の分離レベルで発生しやすく、シリアライゼーションで防止できます。
ファントムリード(Phantom Read)は、トランザクション内で同じクエリを複数回実行した際、別のトランザクションによる行の追加や削除によって結果が変わってしまう現象です。これはSerializable分離レベルで防ぐことができ、特に複数のトランザクションが同じデータセットを操作する場合に問題になります。
むずい😓
What do you do?
7章読む。
TODO