目录
每个级别都有字符或数字编号
我有记忆方法,先是RU、RC, 记住UC顺序,联想到UC WEB。
RR级别作为mysql事务默认隔离级别,是事务完全和性能的折中。SERIALIZABLE级别是悲观地认为幻读时刻都会发生,故会自动地隐式地对事务所需资源加排他锁,其他事务访问此资源会被阻塞等待,故事务是安全的,但需要认值考虑性能。
InnoDB的行锁锁定的是索引,而不是记录本身。索引映射的记录存在就加行锁,如果不存在则会加next-key lock/gap锁/间隙锁, 故InnoDB可以实现事务对某记录的预先占用。
脏读
不可重复读
幻读
幻读并不是说两次读取获取的结果集不同,幻读是指某一次select操作得到的结果所表征的数据状态无法支持后续的业务操作,具体例子:select某记录是否存在,不存在,准备插入此记录,但执行insert时发现此记录已存在,无法插入,此时就发生了幻读。
还一种理解思路,就是因为先采用了"快照读",然后又用了"当前读",发现结果不同。比如先select是快照读,然后update、insert等,这时会用到当前读,发现操作出现未预料结果。
幻读解决方法
参考文章
幻读 https://segmentfault.com/a/1190000016566788
- mysql> SELECT @@tx_isolation;
- +-----------------+
- | @@tx_isolation |
- +-----------------+
- | REPEATABLE-READ |
- +-----------------+
- 1 row in set, 1 warning (0.00 sec)
2)查看系统隔离级别
- mysql> select @@global.tx_isolation;
- +-----------------------+
- | @@global.tx_isolation |
- +-----------------------+
- | READ-UNCOMMITTED |
- +-----------------------+
- 1 row in set, 1 warning (0.00 sec)
2、设置隔离级别
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]
1)设置当前会话
- mysql> set session transaction isolation level repeatable read;
- Query OK, 0 rows affected (0.00 sec)
2)设置系统
- mysql> set global transaction isolation level read uncommitted;
- Query OK, 0 rows affected (0.00 sec)3、命令行,开始事务时用
自己在命令行去验证几种隔离级别下的读问题。
在可提交读, 也就是READ COMMITED情况下,会产生不可重复读。

repeatable read(MySQL默认隔离级别),这时候能解决可重复读。
右边事务提交了,修改了age=29,左边再次查询,还是28。

repeatable read(MySQL默认隔离级别),这时候还会出现幻读。