实践事务隔离级别

  1. 脏读:一个事务重复执行同一查询,但期间这些数据被其他事务修改但还没有提交,结果发现重复查询的结果变了,当其他事务回滚后,重复查询的结果又变回来了,即脏读。可以理解为是否对提交进行隔离。
  2. 不可重复读:一个事务重复执行同一查询,但期间这些数据被其他的事务进行了修改并提交,结果发现重复查询的结果变了(字段值变了),即不可重复读。可以理解为是否对修改进行隔离。
  3. 幻读:一个事务重复执行同一查询,但期间这些数据被其他的事务进行了新增或删除并提交,结果发现重复查询的结果变了(行数变了),即幻影读。可以理解为是否对新增删除进行隔离。
隔离级别 脏读 不可重复读 幻读 备注
读未提交(read uncommitted) 允许 允许 允许  
读已提交(read committed) 不允许 允许 允许 DB2/Oracle/SQL Server默认级别
重复读(repeatted read) 不允许 不允许 允许 其他事物的修改不可见,新增和删除可见。MySQL默认级别
串行性(serializable) 不允许 不允许 不允许 其他事物的修改、新增和删除都不可见

MySQL

查询

mysql> select @@global.tx_isolation,@@tx_isolation;
+-----------------------+-----------------+
| @@global.tx_isolation | @@tx_isolation  |
+-----------------------+-----------------+
| REPEATABLE-READ       | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.00 sec)

设置

方法一:通过修改配置文件mysql.conf

1
transaction-isolation=READ-COMMITTED

方法二:通过命令修改

SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
mysql> set global transaction isolation level read committed; //全局的

mysql> set session transaction isolation level read committed; //当前会话