データのやり取り
トランザクション
データベース(管理システム)に対して実行する「複数の処理のまとまり」を指す
たとえば送金処理(アプリは任意のもので考えよう。私はP〇yP〇yで考える)を考えた場合、送金処理は下記のような流れになる(送金画面で任意の人を選んで、送るボタンを押した後の流れ)
1. 送る金額を入力
2. 「次へ」を押下
3. (任意で)メッセージを入力
4. 「送る」を押下
5. 相手にお金が渡る(自分の出金・相手の入金)
この相手にお金が渡る部分がトランザクション
出金・入金は一つのまとまりであり、これが最小の単位となる
トランザクションは「すべて成功するか」「すべて失敗するか」となる
ACID特性
トランザクションの信頼性・整合性を守るために必要とされる性質
Atomicity(不可分性・原子性)
個人的には、不可分性が翻訳としていいかな。直訳すると確かに原子性ではあるけど
トランザクション内の処理がすべて実行する・取り消されることを保証する
トランザクション内の処理が一部だけ実行されてしまうと、処理完了後にデータ不整合となってしまう
Consistency(一貫性)
トランザクション前後でデータベースに不整合がないこと。矛盾がないこと
Atomicityを守った結果と言える?
MVCC(Multi-Version Concurrency Control)を実装しているデータベースでは、独立性をMVCCで保ったうえで、データの一貫性を保つためにロックをして、データの整合性を保証する
Isolation(独立性)
1つのトランザクション処理結果が、他のトランザクション処理に影響を及ぼさないこと
あくまで「処理結果」に影響を及ぼさないことを保証するため、処理実行速度などには影響を及ぼす場合がある
排他制御によってこの性質が保たれることを保証する
PostgreSQLは複数のロック方法があり、それぞれのロック方法は別のロック方法と競合する
Durability(持続性・耐久性)
トランザクション処理が成功した後に、処理結果が保存され続けること
ハードウェア障害が起こった場合や再起動後でも、処理結果が保存され続けることを保証する
トランザクション実行時に障害が発生した時の対応
なんらかの理由でデータベースに障害が発生した場合は、バックアップファイル(ある時間のデータベースの状態を保存したファイル)とログファイル(トランザクションの前後状態を保存したファイル)を使って復旧する
ロールバックはトランザクションの「実行前」に戻す
ロールフォワードはトランザクションの「実行後」に戻す
ロック
ConsistencyやIsolationの部分で出てきたロックについて
共有ロックと専有ロックの2つがある
共有ロックは複数あってもいいが、専有ロックは単一になる
専有ロックは後から実行することができない
PostgreSQL:「ロックって8種類あんねん」
ロックの単位が小さくなるほど処理に時間がかかる
表単位よりも列単位のほうがかかる
関連リンク
関連するかもしれない雑多なメモ
ロールバックやロールフォワードはトランザクション文脈でよく使われそう
バックアップ&リストア文脈だと実務では使われない印象
ユーザー向けのお知らせで「ロールバック」を使うことは障害報告のお知らせで使うことがある
ただ実際はPITRがおこなわれているのかな
データベースのバックアップという点ではまた別の説明がある