探讨此问题之前,需要了解mysql底层知识。
mysql并发场景
读读场景
线程A和B同时进行读操作,此时不会产生并发问题
读写场景
线程A和B分别进行读操作和写操作;
此时产生两个问题:事务隔离性问题和脏读、幻读、不可重复读问题
写写场景
线程A和B同时进行写操作;此时产生问题:数据丢失问题。
用乐观锁和悲观锁解决写写冲突。
什么是mvcc
mvcc是为了解决事务操作中并发安全问题的无锁并发控制技术,就是上述的读写场景,通过undo日志和readView实现。
readVies结构
示例
一条数据,id=1088,value=张三
a线程update value = 张小三
b线程update value = 张老三
c线程读id=1088
abc线程同时开启,不论ab线程事务是否提交,c线程读的value都是张三,因为c线程事务生成的readView一致,读取的undolog数据一样。