【ACID 特性】Atomicity (原子性) をわかりやすく解説

Atomicity (原子性)Atomicity とは、トランザクション処理が分割できず、以下のどちらかになる特性です。
トランザクションに含まれるすべての操作を実行しない (ROLLBACK)
トランザクションに含まれるすべての操作を実行する (COMMIT)

つまり、Atomicity は処理が途中で終わることを禁止する特性です。

すべての操作を実行しない (ROLLBACK)

すべての操作を実行する (COMMIT)

Atomicity が無い場合、処理が途中で終了し、①の口座からお金が消え、②の口座に届きません。

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

ROLLBACK (全ての操作を実行しない/取消)

ROLLBACKROLLBACK とは、トランザクションを開始する前の状態に戻すことです。

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 円を送金するために、以下のトランザクション処理をします。

  1. Taro の銀行口座から 500 円を減らす
  2. 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 (全ての操作を実行/確定する)

COMMITCOMMIT とは、トランザクション処理の変更を確定することです。

動作確認

Taro から Hanako に 500 円を送金するために、以下のトランザクション処理をします。

  1. Taro の銀行口座から 500 円を減らす
  2. 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 特性の記事一覧
データベースの基礎知識