先看一下事务并发中两个容易混淆的概念:
不可重复读 和 幻读
不可重复读:事务A重复读取同一条数据,在读取的同时事务B修改并提交了这个条数据,那么A再读取的时候就会发生不一致。
mysql中默认的隔离级别是可重复读
如何解决呢:
1:当前读:给改条数据加锁(悲观锁),即读取的时候就加锁,防止其他事务读取该数据().它能保证读取的都是最新数据
2:快照读:mvcc,多版本并发控制,详细的原理就不说了,它使得读写不冲突,由于读的都是事务的当前版本的数据,因此重复读也不会发现数据被修改
在mysql种这两种方式的体现就是加锁和不加锁
普通查询不加锁使用快照读
如果在事务中出了查询外还有其他增加修改操作那么久要手动加锁实现当前读
是否mvcc就解决了幻读呢?一定程度上可以这么说,因为它保证事务中多次读取不会产生新的记录。
但是我们如果在事务中进行了插入操作,是否就能保证这条记录在插入时不存在呢?这点是不能保证的,这也是快照读的弊端。因此如果我们要保证操作安全就要手动加锁,如
select name from student where id >= 0 for update…
或者使用串行化的隔离级别
这是我对mysql幻读的理解,如果理解存在问题欢迎指出。