doilux’s tech blog

ITに関する備忘録。 DDP : http://doiluxng.hatenablog.com/entry/2018/01/01/195409

MySQLのREPEATABLE_READの動き

MySQLもとい、読み取り一貫性機能のあるDBMSのREPEATABLE_READの動作がいつも「どうだっけ?」となるのでメモ。以下MySQLの例

結論

共有ロックは(おそらく)かけておらず、(基本的には)更新と参照は競合しない。

※基本的にはと書いたのは、確かauto-incrementとか制約とかが絡むとロック競合するケースがあったような気がするので

実験

2つのターミナルから接続し、トランザクションを開始する。

mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+

tra1

mysql> select * from test_tab;
+--------+
| status |
+--------+
| apple  |
+--------+

tra2

mysql> select * from test_tab;
+--------+
| status |
+--------+
| apple  |
+--------+

tra1で更新

mysql> update test_tab set status='orange';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from test_tab;
+--------+
| status |
+--------+
| orange |
+--------+
1 row in set (0.00 sec)

tra2で検索

mysql> select * from test_tab;
+--------+
| status |
+--------+
| apple  |
+--------+

読み取り一貫性が効いてる。

tra1をコミット

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

tra2で検索

mysql> select * from test_tab;
+--------+
| status |
+--------+
| apple  |
+--------+

tra2をコミットして再度検索

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test_tab;
+--------+
| status |
+--------+
| orange |
+--------+