つまり、Atomicity は処理が途中で終わることを禁止する特性です。
すべての操作を実行しない (ROLLBACK)
すべての操作を実行する (COMMIT)
Atomicity が無い場合、処理が途中で終了し、①の口座からお金が消え、②の口座に届きません。
ACID 特性の記事一覧 | ||||
---|---|---|---|---|
データベースの基礎知識 | ||||
---|---|---|---|---|
ROLLBACK (全ての操作を実行しない/取消)
ROLLBACK はなんらかの問題が発生した場合に、トランザクション開始前の状態に戻します。
動作確認
以下の検証用テーブルを利用して、Atomicity (原子性) の動作を確認してみます。
CREATE DATABASE IF NOT EXISTS test;
USE test;
CREATE TABLE account(name VARCHAR(20), balance INT);
INSERT INTO account VALUES('Taro',2000);
INSERT INTO account VALUES('Hanako',1000);
SELECT * FROM account;
+--------+---------+ | name | balance | +--------+---------+ | Taro | 2000 | | Hanako | 1000 | +--------+---------+
Taro から Hanako に 500 円を送金するために、以下のトランザクション処理をします。
- Taro の銀行口座から 500 円を減らす
- Hanako の銀行口座に 500 円を増やす
BEGIN; #トランザクションを開始するコマンド
UPDATE account SET balance = balance - 500 WHERE name = 'Taro';
SELECT * FROM account;
+--------+---------+
| name | balance |
+--------+---------+
| Taro | 1500 |
| Hanako | 1000 |
+--------+---------+
ここで障害が発生し、「2. Hanako の銀行口座に 500 円を増やす」が出来ない場合を考えます。
ROLLBACK を利用して、トランザクション開始前の状態に戻します。
ROLLBACK;
SELECT * FROM account;
+--------+---------+
| name | balance |
+--------+---------+
| Taro | 2000 |
| Hanako | 1000 |
+--------+---------+
ROLLBACK でトランザクション開始前の状態に戻るため、Atomicity を満たします。
COMMIT (全ての操作を実行/確定する)
動作確認
Taro から Hanako に 500 円を送金するために、以下のトランザクション処理をします。
- Taro の銀行口座から 500 円を減らす
- Hanako の銀行口座に 500 円を増やす
SELECT * FROM account;
+--------+---------+ | name | balance | +--------+---------+ | Taro | 2000 | | Hanako | 1000 | +--------+---------+
BEGIN;
UPDATE account SET balance = balance - 500 WHERE name = 'Taro';
UPDATE account SET balance = balance + 500 WHERE name = 'Hanako';
COMMIT;
SELECT * FROM account;
+--------+---------+ | name | balance | +--------+---------+ | Taro | 1500 | | Hanako | 1500 | +--------+---------+
上記のトランザクションは COMMIT して確定いるため、ROLLBACK で戻すことはできません。
ROLLBACK;
SELECT * FROM account;
+--------+---------+ | name | balance | +--------+---------+ | Taro | 1500 | | Hanako | 1500 | +--------+---------+
全ての変更が確定しているため、Atomicity を満たします。
最後に
関連記事
ACID 特性の記事一覧 | ||||
---|---|---|---|---|
データベースの基礎知識 | ||||
---|---|---|---|---|