http://xm-king.javaeye.com/blog/770721
他写的很好
这里再看看能够说明innodb repetable-read时避免幻读的例子:
client 1:
mysql> select version(); +------------------+ | version() | +------------------+ | 5.1.41-debug-log | +------------------+ 1 row in set (0.00 sec)
mysql> show variables like '%isola%'; +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | tx_isolation | REPEATABLE-READ | +---------------+-----------------+ 1 row in set (0.00 sec)
mysql> rollback; Query OK, 0 rows affected (0.00 sec) mysql> select * from x1; +---+---------+ | i | s | +---+---------+ | 1 | one | | 2 | two | | 3 | triple1 | | 4 | four | +---+---------+ 4 rows in set (0.00 sec)
mysql> start transaction; Query OK, 0 rows affected (0.00 sec)
client 2:
mysql> rollback; Query OK, 0 rows affected (0.00 sec) mysql> select * from x1; +---+---------+ | i | s | +---+---------+ | 1 | one | | 2 | two | | 3 | triple1 | | 4 | four | +---+---------+ 4 rows in set (0.00 sec)
mysql> start transaction; Query OK, 0 rows affected (0.00 sec)
client 3:
mysql> rollback; Query OK, 0 rows affected (0.00 sec) mysql> select * from x1; +---+---------+ | i | s | +---+---------+ | 1 | one | | 2 | two | | 3 | triple1 | | 4 | four | +---+---------+ 4 rows in set (0.00 sec)
注意 client3的操作都没有启动事务、i.e. 自动提交
---------------------------------------------------------------- 准备工作结束:
client 1:
mysql> select * from x1; +---+---------+ | i | s | +---+---------+ | 1 | one | | 2 | two | | 3 | triple1 | | 4 | four | +---+---------+ 4 rows in set (0.00 sec)
client 3:
4 rows in set (0.00 sec)
mysql> insert into x1 (s) values ('five'); Query OK, 1 row affected (0.05 sec) mysql> select * from x1; +---+---------+ | i | s | +---+---------+ | 1 | one | | 2 | two | | 3 | triple1 | | 4 | four | | 8 | five | +---+---------+ 5 rows in set (0.00 sec)
client 1:
mysql> select * from x1; +---+---------+ | i | s | +---+---------+ | 1 | one | | 2 | two | | 3 | triple1 | | 4 | four | +---+---------+ 4 rows in set (0.00 sec)
------------------------------------- innodb 在repetable-read级别不会出现幻读
client 2:
+---+---------+ | i | s | +---+---------+ | 1 | one | | 2 | two | | 3 | triple1 | | 4 | four | | 8 | five | +---+---------+ 5 rows in set (0.00 sec)
------------------------------------- 由于client2从来没有select x1,此处虽然出现 five也不能说出现幻读
client 3:
mysql> insert into x1 (s) values ('size'); Query OK, 1 row affected (0.10 sec) mysql> select * from x1; +---+---------+ | i | s | +---+---------+ | 1 | one | | 2 | two | | 3 | triple1 | | 4 | four | | 8 | five | | 9 | size | +---+---------+ 6 rows in set (0.00 sec)
client 1:
mysql> select * from x1; +---+---------+ | i | s | +---+---------+ | 1 | one | | 2 | two | | 3 | triple1 | | 4 | four | +---+---------+ 4 rows in set (0.00 sec)
client 2:
mysql> select * from x1; +---+---------+ | i | s | +---+---------+ | 1 | one | | 2 | two | | 3 | triple1 | | 4 | four | | 8 | five | +---+---------+ 5 rows in set (0.00 sec)
------------------------------------- innodb在repetable-read级别不会出现幻读
client 1:
mysql> rollback; Query OK, 0 rows affected (0.00 sec) mysql> select * from x1; +---+---------+ | i | s | +---+---------+ | 1 | one | | 2 | two | | 3 | triple1 | | 4 | four | | 8 | five | | 9 | size | +---+---------+ 6 rows in set (0.00 sec)
client 2:
mysql> rollback; Query OK, 0 rows affected (0.00 sec) mysql> select * from x1; +---+---------+ | i | s | +---+---------+ | 1 | one | | 2 | two | | 3 | triple1 | | 4 | four | | 8 | five | | 9 | size | +---+---------+ 6 rows in set (0.00 sec)
///
这里再看看能够说明innodb repetable-read时避免不可重复读的例子:
client 1:
mysql> show variables like '%isola%'; +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | tx_isolation | REPEATABLE-READ | +---------------+-----------------+ 1 row in set (0.00 sec) mysql> rollback; Query OK, 0 rows affected (0.00 sec) mysql> select * from x1; +---+---------+ | i | s | +---+---------+ | 1 | one | | 2 | two | | 3 | triple1 | | 4 | four | | 8 | five | | 9 | size | +---+---------+ 6 rows in set (0.00 sec)
mysql> start transaction; Query OK, 0 rows affected (0.00 sec)
client 2:
mysql> rollback; Query OK, 0 rows affected (0.00 sec) mysql> select * from x1; +---+---------+ | i | s | +---+---------+ | 1 | one | | 2 | two | | 3 | triple1 | | 4 | four | | 8 | five | | 9 | size | +---+---------+ 6 rows in set (0.00 sec)
mysql> start transaction; Query OK, 0 rows affected (0.00 sec)
---------------------------------------------------------------- 准备工作结束:
client 1:
mysql> update x1 set s='four1' where i=4; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from x1; +---+---------+ | i | s | +---+---------+ | 1 | one | | 2 | two | | 3 | triple1 | | 4 | four1 | | 8 | five | | 9 | size | +---+---------+ 6 rows in set (0.00 sec)
client 2:
mysql> select * from x1; +---+---------+ | i | s | +---+---------+ | 1 | one | | 2 | two | | 3 | triple1 | | 4 | four | | 8 | five | | 9 | size | +---+---------+ 6 rows in set (0.00 sec)
------------------------------------- innodb在repetable-read是不会出现脏读
client 1:
mysql> commit; Query OK, 0 rows affected (0.08 sec) mysql> select * from x1; +---+---------+ | i | s | +---+---------+ | 1 | one | | 2 | two | | 3 | triple1 | | 4 | four1 | | 8 | five | | 9 | size | +---+---------+ 6 rows in set (0.00 sec)
client 2:
mysql> select * from x1; +---+---------+ | i | s | +---+---------+ | 1 | one | | 2 | two | | 3 | triple1 | | 4 | four | | 8 | five | | 9 | size | +---+---------+ 6 rows in set (0.01 sec)
------------------------------------- innodb在repetable-read是不会出现不可重复读
that's all, thank u