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 | +--------+