ダーティリード
別のトランザクションが、まだ COMMIT してないデータが読み取れる現象
サンプル
mysql1 と mysql2 のトランザクション分離レベルを READ UNCOMMITTED に変更する
code:sql
mysql1> SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
mysql2> SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
mysql1 を SELECT
code:sql
mysql> SELECT * FROM test;
+----+-----------+-----+
| id | name | age |
+----+-----------+-----+
| 7 | sato | 10 |
| 8 | suzuki | 20 |
| 9 | takahashi | 30 |
+----+-----------+-----+
3 rows in set (0.00 sec)
mysql1 のトランザクションを開始し、データを INSERT、UPDATE しても COMMIT しない
code:sql
mysql1> BEGIN;
mysql1> INSERT INTO test (name, age) VALUES ('baby', 1);
mysql1> UPDATE test SET age = 40 WHERE name = 'sato';
mysql1 で SELECT
code:sql
mysql> SELECT * FROM test;
+----+-----------+-----+
| id | name | age |
+----+-----------+-----+
| 7 | sato | 40 |
| 8 | suzuki | 20 |
| 9 | takahashi | 30 |
| 10 | baby | 1 |
+----+-----------+-----+
4 rows in set (0.00 sec)
mysql2 で SELECT すると mysql1 の未コミットデータが見える
code:sql
mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM test;
+----+-----------+-----+
| id | name | age |
+----+-----------+-----+
| 7 | sato | 40 |
| 8 | suzuki | 20 |
| 9 | takahashi | 30 |
| 10 | baby | 1 |
+----+-----------+-----+
4 rows in set (0.00 sec)