(1)回顾:
简单来说,脏读,脏写,不可重复读和幻读都是别人在更新数据的时候,怎么读的问题,读的不对就有问题,读的方法对了,那就不存在这一系列问题的。而要解决一系列问题,可以基于
undo log版本链条以及ReadView实现的mvcc机制。
(2)当有多个事务并发更新一行数据的时候,如何防止脏写?
其实靠锁机制,依靠锁机制让多个事务更新一行数据的时候串行化,避免同时更新一行数据,在MySQL里,假设有一行数据,此时有一个事务来了要更新这行数据,这时候看下这行数据有没有人
加锁,一看没人加锁,说明这个事务是先到的,此时这个事务就会创建一个锁,里面包含了自己的trx_id和等待状态,然后把锁和这行数据关联在一起。
更新一行数据必须把他所在的数据从磁盘文件里加载到缓存页里才能更新,所以此时这行数据和关联的锁结构都是在内存里的,然后事务B过来了,这个事务B也想更新那行数据,此时就检查下
,当前这行数据有没有人加锁,然后发现事务A抢先加锁,这时事务B也会加个锁生成一个锁数据结构,里面有它的trx_id还有自己的等待状态,因为在排队所以等待状态是true。
接着事务A更新完了数据,把自己的锁释放掉了。锁一旦释放了,它就会找还有没有对这行数据加锁的事务,然后发现事务B加锁了,于是这个时候,就把事务B的锁里的等待状态修改为false,
然后唤醒事务B继续执行,此时事务B就获取到锁了。
(3)总结:
上述是MySQL中的锁机制的一个最基本原理,其实是跟Java里的锁机制,思路是类似的,从这种简单的锁里引申出很多其他概念,比如读写锁,共享锁,独占锁,公平锁和非公平锁,等等。