Consistency の定義は曖昧ですが、本記事はデータベース制約について記載します。
(過去のトランザクションの結果を保証する方法は、Durability の記事で説明します。)
Consistency is one of the four guarantees that define ACID transactions; however, significant ambiguity exists about the nature of this guarantee. It is defined variously as:
https://en.wikipedia.org/wiki/Consistency_(database_systems)
- The guarantee that database constraints are not violated, particularly once a transaction commits.[2][3][4][5][6]
- The guarantee that any transactions started in the future necessarily see the effects of other transactions committed in the past.[7][8]
なお、制約内容はアプリの内容に依存するため、基本的にアプリ側の責任となります。
ACID 特性の記事一覧 | ||||
---|---|---|---|---|
データベースの基礎知識 | |||||
---|---|---|---|---|---|
データベースで設定する制約
データベース側で Consistency を保つ場合は、次のような、なんらかの制約を設定します。
- PRIMARY KEY (値が一意かつ NOT NULL)
- FOREIGN KEY (指定した他のテーブルの列に含まれる値のみを格納可能)
- 無効データ (特定の値を禁止)
- ENUM および SET (指定した値のみ格納可能)
トランザクションで制約を違反した場合、違反した SQL 文に対して ROLLBACK が発生します。
通常、データ変更ステートメント (
https://dev.mysql.com/doc/refman/8.0/ja/constraint-primary-key.htmlINSERT
やUPDATE
など) がプライマリキー、一意キー、または外部キーの制約に違反すると、エラーが発生します。InnoDB
などのトランザクションストレージエンジンを使用している場合、MySQL ではステートメントが自動的にロールバックされます。
動作確認
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
PRIMARY KEY が重複した場合は ROLLBACK するため、Consistency を満たしています。
+------------+------+ | account_id | name | +------------+------+ | 1 | hoge | +------------+------+
動作確認
foreign_account_id INT,
balance INT,
FOREIGN KEY (foreign_account_id) REFERENCES consistency1(account_id));
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`consistency2`, CONSTRAINT `consistency2_ibfk_1` FOREIGN KEY (`foreign_account_id`) REFERENCES `consistency1` (`account_id`))
consistency1 に存在しない会員 ID は ROLLBACK するため、Consistency を満たします。
Empty set (0.00 sec)
今回は UNSIGNED 属性 (負の整数を禁止) で検証します。
動作確認
ERROR 1264 (22003): Out of range value for column 'balance' at row 1
無効データの挿入を禁止して、Consistency を満たしています。
Empty set (0.00 sec)
動作確認
ERROR 1265 (01000): Data truncated for column 'grade' at row 1
デフォルトの SQL モードでは、ENUM に無い値はエラーとなり、Consistency を満たします。
Empty set (0.00 sec)
最後に
関連記事
ACID 特性の記事一覧 | ||||
---|---|---|---|---|
データベースの基礎知識 | |||||
---|---|---|---|---|---|