【ACID 特性】Consistency (一貫性) をわかりやすく解説

Consistency (一貫性)Consistency とは、トランザクション前後で整合性を満たす特性です。

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:

  • 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]
https://en.wikipedia.org/wiki/Consistency_(database_systems)

なお、制約内容はアプリの内容に依存するため、基本的にアプリ側の責任となります。

ACID 特性の記事一覧
データベースの基礎知識
スポンサーリンク

データベースで設定する制約

データベース側で Consistency を保つ場合は、次のような、なんらかの制約を設定します。

トランザクションで制約を違反した場合、違反した SQL 文に対して ROLLBACK が発生します。

通常、データ変更ステートメント (INSERTUPDATE など) がプライマリキー、一意キー、または外部キーの制約に違反すると、エラーが発生します。InnoDB などのトランザクションストレージエンジンを使用している場合、MySQL ではステートメントが自動的にロールバックされます。

https://dev.mysql.com/doc/refman/8.0/ja/constraint-primary-key.html

PRIMARY KEY(主キー)

PRIMARY KEY とは、列の値が一意かつ NULL を禁止する制約です。

動作確認

CREATE TABLE consistency1(account_id INT NOT NULL PRIMARY KEY, name VARCHAR(20));
BEGIN;
INSERT INTO consistency1 VALUES(1,'hoge');
INSERT INTO consistency1 VALUES(1,'tech');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

PRIMARY KEY が重複した場合は ROLLBACK するため、Consistency を満たしています。

SELECT * FROM consistency1;
+------------+------+
| account_id | name |
+------------+------+
|          1 | hoge |
+------------+------+

FOREIGN KEY(外部キー)

FOREIGN KEY とは、関連テーブルにある値のみ格納可能な制約です。
Consistency1 に存在しない会員 ID で、Consistency2 に登録禁止

動作確認

CREATE TABLE consistency2 (
foreign_account_id INT,
balance INT,
FOREIGN KEY (foreign_account_id) REFERENCES consistency1(account_id));
BEGIN;
INSERT INTO consistency2 VALUES(2,3000);
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 を満たします。

SELECT * FROM consistency2;
Empty set (0.00 sec)

無効なデータ

無効なデータ とは、特定のデータの格納を禁止する制約です。

今回は UNSIGNED 属性 (負の整数を禁止) で検証します。

動作確認

CREATE TABLE consistency3(balance INT UNSIGNED);
BEGIN;
INSERT INTO consistency3 VALUES(-1);
ERROR 1264 (22003): Out of range value for column 'balance' at row 1

無効データの挿入を禁止して、Consistency を満たしています。

SELECT * FROM consistency3;
Empty set (0.00 sec)

ENUM および SET

ENUM および SET とは、特定の値のみを列に格納できる制約です。

動作確認

CREATE TABLE consistency4(grade ENUM('bronze', 'silver', 'gold'));
BEGIN;
INSERT INTO consistency4 VALUES('blue');
ERROR 1265 (01000): Data truncated for column 'grade' at row 1

デフォルトの SQL モードでは、ENUM に無い値はエラーとなり、Consistency を満たします。

SELECT * FROM consistency4;
Empty set (0.00 sec)
スポンサーリンク

最後に

関連記事

ACID 特性の記事一覧
データベースの基礎知識