9cubed
ブログ | PHP | JavaScript | TypeScript | Vue.js | Laravel | Tailwind | Vite | Python | MariaDB | SQLite | Node.js | Linux | PowerShell | Docker | Git | Web | その他
< 前の記事

ギャップロック・ネクストキーロック

次の記事 >

カレントリード

MariaDB

[MariaDB]スナップショット

公開日:2026-01-08
更新日:2026-01-08

1. 概要

スナップショットについてです。

分離レベルが 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;
< 前の記事

ギャップロック・ネクストキーロック

次の記事 >

カレントリード

YouTube X

新着一覧

  • async、awaitJavaScript
  • Promise についてJavaScript
  • パッケージの管理Node.js
  • v-model(双方向バインディング)Vue.js
  • VS Code で GitHub を使ったソース管理Git
  • computed(再計算)Vue.js
  • watchDebounced(値の監視)Vue.js
  • watch(値の監視)Vue.js
  • change イベントVue.js
  • v-memoVue.js

アーカイブ

  • 2026/03
  • 2026/02
  • 2026/01
  • 2025/12
  • 2025/11
  • 2025/10
  • 2025/09
  • 2025/08
  • /00

以前のカテゴリー一覧

  • CakePHP3
  • CentOS7
  • HTML・CSS・JavaScript
  • Haskell
  • JavaScript
  • Kotlin
  • Laravel5
  • PHP
  • Python
  • Ruby
  • RubyOnRails5
  • TypeScript
  • Vue.js
  • Webサーバ講座
  • Webプログラミング講座
  • jQuery
  • linux
  • パソコン講座
  • ブログ
  • プログラミング講座
  • メモ帳作成講座
  • 数学

Copyright © 9cubed. All Rights Reserved.

プライバシーポリシー 利用規約
▲