- 脏读:
一个事务
重复执行同一查询,但期间这些数据被其他事务
修改但还没有提交
,结果发现重复查询的结果变了,当其他事务回滚后,重复查询的结果又变回来了,即脏读
。可以理解为是否对提交
进行隔离。 - 不可重复读:
一个事务
重复执行同一查询,但期间这些数据被其他的事务
进行了修改并提交
,结果发现重复查询的结果变了(字段值变了),即不可重复读
。可以理解为是否对修改
进行隔离。 - 幻读:
一个事务
重复执行同一查询,但期间这些数据被其他的事务
进行了新增或删除并提交
,结果发现重复查询的结果变了(行数变了),即幻影读
。可以理解为是否对新增
和删除
进行隔离。
隔离级别 | 脏读 | 不可重复读 | 幻读 | 备注 |
---|---|---|---|---|
读未提交(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 |
|
方法二:通过命令修改
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; //当前会话