トランザクション
- 複数のクエリを一貫性のある形でひとまとまりにしたもの
ACID
Atomicity(原子性)
- 処理が全て成功するかすべて失敗するかのどちらかを保証する仕組み
COMMIT
を発行して処理を確定させるが、それ前で失敗したらROLLBACK
で戻される
Consistency(一貫性/整合性)
- あらかじめ設定された整合性を保つ
- NOT NULL 制約とか
Isolation(独立性 / 分離性、隔離性)
- 他の処理に影響を与えず、それぞれの処理が矛盾なく行えることを保証
- あるトランザクションがテーブルにレコードをを追加していたとしても、コミットされるまでは、ほかのトランザクションからはその新規に追加されたレコードは「見えない」状態にある
分離レベル
- ANSI により定義
- 分離姓は、トランザクションどうしがどれだけ干渉しあわないかという概念ですが、その実装においては完全に分離しているものだけでなく、いつくかの段階が存在
非コミット読み取り(Read Uncommitted)
- トランザクションどうしがまったく独立してない分離レベル
- トランザクションは他のトランザクションが行った変更を、コミットされる前であっても、見ることが可能
ダーティリード
コミット済み読み取り(Read Committed)
- ほとんどのデータベースのデフォルト
- 他のトランザクションがコミットした変更だけを見ることが可能
- 同じ SELECT 文を 2 回実行すると、その間に別のトランザクションがコミットを行った場合にその結果が見えてしまう(UPDATE の実行が見える)
ノンリピータブルリード
ファジーリード
再読み込み可能読み込み(Repeatable Read)
- トランザクション内で同じ SELECT を実行すると、常に同じ結果になることが保証されている分離レベル
ノンリピータブルリード
は防ぐことが可能だが、あるトランザクションを読み込んだとき、選択できるデータが現れたり消えたりする現象(ファントムリード
: INSERT されたデータが見える) が起きるとされる- InnoDB の REPEATABLE-READ では、ネクストキーロック(Next Key Lock) という仕組みがあるためファントムリードは起こらない
- InnoDB のデフォルトの分離レベル
- 直列化可能(Serializable)
- 実際には並列で実行されたトランザクションが、時間的な重なりがない状態でコミットされた順序で実行すると、実際に実行されたものと同じ実行結果になるということが保証される分離レベル
- 直列化可能
- InnoDB の SERIALIZABLE では、参照した行に対して自動的に共有ロック(LOCK IN SHARE MODE) がかけられる
- ロストアップデートを防ぐことが可能
Durability(永続性/耐久性, 持続性)
- 一連のデータ操作を完了(COMMIT) し、完了通知をユーザーが受けた時点で、その操作が永続的となり結果が失われないことを示す
BASE
結果整合性
- Basically Available
- 可用性が高め
- Soft State
- 状態遷移が厳密でない
- Eventually Consistent
- 最終的には整合性が保たれる
トランザクション設計で気をつけること
- ロングトランザクションの回避
- トランザクションの処理量を意識
デッドロック
を防ぐ- アクセスするテーブルの順番を一致させる
- ORDER BY を使い、アクセスするレコード順序を一致させるように処理
- トランザクションを頻繁にコミット
- ロックの範囲を小さく(テーブル単位 => 行単位)
- オートコミット
Others
セキュリティ
- 不要な接続、不要な権限、過剰な権限をみる
バックアップ方式の選び方
- リカバリー要件を考える
- RPO : どの時点の状態に復旧するのか
- RTO : 復旧までに許される時間はどれくらいか
- バックアップ方法
- コールドバックアップ
- オンライン論理バックアップ
- dump の取得
- オンライン物理バックアップ
- ある時点でベースとなるバックアップを取得しておき、その時点以降の差分を記録しているトランザクションログと組み合わせて、障害発生時点までのリカバリーをする方法
- トランザクションログ必須
- リストア時間の検証
- リカバリー要件を考える