[MariaDB]スナップショット
公開日:2026-01-08
更新日:2026-01-08
更新日:2026-01-08
1. 概要
スナップショットについてです。
分離レベルが REPEATABLE READ(デフォルト)で SELECT をした場合、
スナップショットと呼ばれるデータベースの特定の時点の状態から取得するため、
基本的には、他のトランザクションによる変更の影響を受けません。
但し、スナップショットは、トランザクション開始直後ではなく、最初にテーブルに SELECT した時点の状態がスナップショットとなるため、
トランザクションを開始してから SELECT する前に他のトランザクションでデータを変更されると、変更されたデータがスナップショットに含まれます。
分離レベルが REPEATABLE READ(デフォルト)で SELECT をした場合、
スナップショットと呼ばれるデータベースの特定の時点の状態から取得するため、
基本的には、他のトランザクションによる変更の影響を受けません。
但し、スナップショットは、トランザクション開始直後ではなく、最初にテーブルに SELECT した時点の状態がスナップショットとなるため、
トランザクションを開始してから SELECT する前に他のトランザクションでデータを変更されると、変更されたデータがスナップショットに含まれます。
2. 動作確認
2.1 テストデータ
テストデータは、「排他ロック・共有ロック」で作成したものを使用します。
テストデータの作成
テストデータの作成
コマンド
CREATE DATABASE test_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE TABLE products (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255),
price INTEGER,
stock INTEGER DEFAULT 0,
PRIMARY KEY (id)
);
INSERT INTO products (id, name, price, stock) VALUES (1, 'A', 1000, 10), (2, 'B', 2000, 20), (3, 'C', 3000, 30);2.2 他のトランザクションでコミットされたデータを取得しないケース
AとBは異なるトランザクション
コマンド
# 初期設定
UPDATE products SET stock = 10 where id = 1;
A:BEGIN;
B:BEGIN;
B:SELECT stock FROM products where id = 99999; # この時点がスナップショットとなる
A:UPDATE products SET stock = 999 where id = 1;
A:COMMIT;
B:SELECT stock FROM products where id = 1; # stock:10。他のトランザクションで変更されているが影響を受けない
B:COMMIT;2.3 他のトランザクションでコミットされたデータを取得するケース
コマンド
# 初期設定
UPDATE products SET stock = 10 where id = 1;
A:BEGIN;
B:BEGIN;
A:UPDATE products SET stock = 999 where id = 1;
A:COMMIT;
B:SELECT stock FROM products where id = 1; # stock:999。Aでコミットされた値を取得する。この時点がスナップショットとなる。
B:COMMIT;
