目录
Mysql的隔离级别,以及存在的并发事务问题
1. 数据库在并发情况下的常见操作
1. 读-读
不存在任何问题,也不需要并发控制
2. 读-写
有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读、不可重复读、幻读
3. 写-写
有线程安全问题,可能会存在更新丢失问题
2. Mysql的隔离级别以及解决的问题
1. READ-UNCOMMITTED(读未提交)
可能导致的问题:脏读
解决:用行锁,隔离级别升级,读已提交或以上
2. READ-COMMITTED(读已提交)
可能导致的问题:不可重复读
解决:隔离级别升级,升级到可重复读或以上
3. REPEATABLE-READ(可重复读,默认隔离级别)
可能导致的问题:幻读
有疑问:有人说,在innodb存储引擎下,默认开启间隙锁,是能解决幻读的问题的
解决:隔离级别升级,升级到串行化
定义:可重复读指的是在一个事务里,我两次select查询到的数据应该是一样的
4. SERIALIZABLE(串行化)
可避免幻读。读加共享锁,写加排他锁。这样读取事务可以并发,但是读写,写写事务之间都是互斥的
3. 问:不可重复读和幻读的区别是什么?
维度不同,不可重复读是针对某个数据来说的,幻读针对某一行来说的
- 不可重复读侧重于update这种操作,同一条数据前后读起来不一样的情况,
- 幻读侧重于insert、delete这种操作,前后两次select 数据的数量会发生变化