FE EXAM

一貫性(Consistency)

トランザクション前後でデータベースの整合性が保たれる性質。

DIAGRAM
実行前(正しい状態)実行後(正しい状態)
例: 口座Aから口座Bへ 100 を振込(合計は常に 500 で一定)実行前口座A: 300口座B: 200合計: 500 ✓トランザクションA = A - 100B = B + 100実行後口座A: 200口座B: 300合計: 500 ✓✕ 一貫性が崩れた例(許されない結果)口座A: 200(引いた)口座B: 200(足し忘れ)合計: 400 ✕合計が 500 から 400 に減ってしまった → ルール(合計一定)に違反 → DBMSはこの状態を残さない
解説

📌
一貫性とは

正しい状態 → 正しい状態合計 500 ✓実行前合計 500 ✓実行後

一貫性(Consistency)とは、トランザクションの実行前後で、データベースが整合性(決められたルール)を満たした正しい状態に保たれる性質です。トランザクション=「いくつかの操作をまとめた1つの処理単位」のことです。

ポイントは「途中」ではなく「前後」を見ていることです。処理の途中で一時的に値が崩れることがあっても、処理が終わった時点では必ずルールを満たした状態に戻っていることを保証します。

身近な例で考えると、友達同士の割り勘のようなものです。誰がいくら払うか組み替えても、合計金額は変わってはいけません。上の図解のように、口座Aから口座Bへ振り込んでも「合計500」というルールは保たれる──これが一貫性です。

📌
制約の遵守

一貫性でいう「正しい状態」とは、データベースに設定された整合性制約(データが守るべきルール)を満たしている状態のことです。代表的な制約には次のものがあります。
一意性制約:主キーなどの値が重複してはいけない
参照整合性制約:存在しない値を参照してはいけない(例: 存在しない部署IDを社員に設定できない)
検査制約(CHECK):値が決められた範囲を守る(例: 在庫数はマイナスにできない)
NOT NULL制約:必須項目を空にできない

トランザクションが終わった結果これらの制約を1つでも破ってしまう場合、DBMSはその処理を受け付けず(コミットさせず)、元の正しい状態に戻します。これにより、データベースは常にルールを満たした状態に保たれます。

上の図解の下段が、制約に違反した「許されない例」です。口座Aから引いたのに口座Bへ足し忘れて合計が500から400に減ってしまうと、整合性のルールに反するため、この状態はデータベースに残されません。

📌
他の特性との関係

一貫性は、ACIDの他の3特性(原子性・独立性・永続性)と密接に関係しています。一貫性は「正しい状態を保つ」という目標であり、それを実現する手段が他の3つだと考えると分かりやすいです。

特性一貫性への貢献
原子性(A)中途半端な処理を残さないので、半分だけ反映された不整合を防ぐ
独立性(I)同時実行する処理同士を干渉させないので、混ざり合った不整合を防ぐ
永続性(D)一度正しくした状態を障害後も維持するので、整合性が消えない

つまり、原子性・独立性・永続性がそろって支えることで、一貫性が成り立つのです。一貫性だけが単独で実現できるわけではなく、4つの特性が連携して初めて「いつ見てもルールを守った正しいデータベース」になります。

練習問題

🎯
基本情報技術者 練習問題

Q1.トランザクションの一貫性(Consistency)の説明として最も適切なものはどれか。
A.トランザクション前後でデータベースの整合性が保たれる
B.処理がすべて成功するか、すべて失敗するかのどちらかになる
C.複数の処理を同時に実行しても互いに干渉しない
D.確定した結果が障害後も失われない
Q2.一貫性を支える「整合性制約」の例として適切でないものはどれか。
A.主キーは重複してはならない(一意性制約)
B.存在しない部署IDを社員に設定できない(参照整合性制約)
C.在庫数はマイナスにできない(検査制約)
D.SQL文は必ず3秒以内に終わらなければならない
Q3.一貫性と他のACID特性の関係として正しいものはどれか。
A.一貫性は原子性・独立性・永続性に支えられて成り立つ
B.一貫性さえあれば他の3つは不要になる
C.一貫性は他の特性とまったく無関係である
D.一貫性は永続性と同じ意味である

関連コンテンツ