为了保证并发时操作数据的正确性,数据库都会有事务隔离级别的概念。
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
READ UNCOMITTED | √ | √ | √ |
READ COMMITTED | × | √ | √ |
REPEATABLE READ | × | × | √ |
SERIALIZABLE | × | × | × |
mysql> CREATE TABLE testnum( -> num INT(4)); Query OK, 0 rows affected (0.57 sec) mysql> INSERT INTO test.testnum (num) VALUES(1),(2),(3),(4),(5); Query OK, 5 rows affected (0.09 sec)
mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; Query OK, 0 rows affected (0.04 sec) flush privileges; Query OK, 0 rows affected (0.04 sec)
mysql> show variables like '%tx_isolation%'\G *************************** 1. row *************************** Variable_name: tx_isolation Value: READ-UNCOMMITTED 1 row in set, 1 warning (0.00 sec)结果显示,现在 MySQL 的事务隔离级别为 READ-UNCOMMITTED。
mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM testnum; +------+ | num | +------+ | 1 | | 2 | | 3 | | 4 | | 5 | +------+ 5 rows in set (0.00 sec)
mysql> show variables like '%tx_isolation%'\G *************************** 1. row *************************** Variable_name: tx_isolation Value: READ-UNCOMMITTED 1 row in set, 1 warning (0.00 sec)
mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> UPDATE test.testnum SET num=num*2 WHERE num=2; Query OK, 1 row affected (0.02 sec) Rows matched: 1 Changed: 1 Warnings: 0
mysql> SELECT * FROM testnum; +------+ | num | +------+ | 1 | | 4 | | 3 | | 4 | | 5 | +------+ 5 rows in set (0.02 sec)由结果可以看出,A 窗口中的事务读取到了更新后的数据。
mysql> ROLLBACK; Query OK, 0 rows affected (0.09 sec)
mysql> SELECT * FROM testnum; +------+ | num | +------+ | 1 | | 2 | | 3 | | 4 | | 5 | +------+ 5 rows in set (0.00 sec)
mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED; Query OK, 0 rows affected (0.00 sec) mysql> show variables like '%tx_isolation%'\G *************************** 1. row *************************** Variable_name: tx_isolation Value: READ-COMMITTED 1 row in set, 1 warning (0.00 sec)
mysql> BEGIN; Query OK, 0 rows affected (0.00 sec)
mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> UPDATE test.testnum SET num=num*2 WHERE num=2; Query OK, 1 row affected (0.07 sec) Rows matched: 1 Changed: 1 Warnings: 0
mysql> SELECT * from test.testnum; +------+ | num | +------+ | 1 | | 2 | | 3 | | 4 | | 5 | +------+ 5 rows in set (0.00 sec)
mysql> COMMIT; Query OK, 0 rows affected (0.07 sec)
mysql> SELECT * from test.testnum; +------+ | num | +------+ | 1 | | 4 | | 3 | | 4 | | 5 | +------+ 5 rows in set (0.00 sec)
mysql> CREATE TABLE testuser( -> id INT (4) PRIMARY KEY, -> name VARCHAR(20)); Query OK, 0 rows affected (0.29 sec)
mysql> SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ; Query OK, 0 rows affected (0.00 sec)
mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM test.testuser where id=1; Empty set (0.04 sec)
mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO test.testuser VALUES(1,'zhangsan'); Query OK, 1 row affected (0.04 sec) mysql> COMMIT; Query OK, 0 rows affected (0.06 sec)
mysql> INSERT INTO test.testuser VALUES(1,'lisi'); ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY' mysql> SELECT * FROM test.testuser where id=1; Empty set (0.00 sec)
Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有