データのやり取り
カテゴリー: #アンラーニング #リスキリング
kuboshoのアンラーニング・リスキリングの4日目は「データのやり取り」を取り扱う。
ここではデータベースのトランザクションと排他処理のみ扱う。
トランザクション
データベース(管理システム)に対して実行する「複数の処理のまとまり」を指す
たとえば送金処理(アプリは任意のもので考えよう。私は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種類あんねん」
PostgreSQL: Documentation: 18: 13.3. Explicit Locking
ロックの単位が小さくなるほど処理に時間がかかる
表単位よりも列単位のほうがかかる
関連リンク
今更聞けないACID特性について解説 #SQL - Qiita
データベースのロックの基礎からデッドロックまで
データベースの楽観ロックと悲観ロックを理解する
関連するかもしれない雑多なメモ
ロールバックやロールフォワードはトランザクション文脈でよく使われそう
バックアップ&リストア文脈だと実務では使われない印象
ユーザー向けのお知らせで「ロールバック」を使うことは障害報告のお知らせで使うことがある
ただ実際はPITRがおこなわれているのかな
データベースのバックアップという点ではまた別の説明がある
PostgreSQL: Documentation: 18: 25.1. SQL Dump
PostgreSQL: Documentation: 18: 25.2. File System Level Backup
PostgreSQL: Documentation: 18: 25.3. Continuous Archiving and Point-in-Time Recovery (PITR)
PITRは補足的にWikipediaのリンクも載せておこう:ポイントインタイムリカバリ - Wikipedia
#アドベントカレンダー