网站广告收入如何缴文化事业建设费,wordpress非代码方式添加备案号,网页设计和网站开发有什么区别,如何取外贸网站域名之前我们已经用很多篇幅给大家讲解了多个事务并发运行的时候#xff0c;如果同时要读写一批数据#xff0c;此时读和写时间的关系是如何协调的#xff0c;毕竟要是你不协调好的话#xff0c;可能就会有脏读、不可重复读、幻读等一系列的问题。
简单来说#xff0c;脏读、…之前我们已经用很多篇幅给大家讲解了多个事务并发运行的时候如果同时要读写一批数据此时读和写时间的关系是如何协调的毕竟要是你不协调好的话可能就会有脏读、不可重复读、幻读等一系列的问题。
简单来说脏读、不可重复读、幻读都是别人在更新数据的时候你怎么读的问题读的不对那就有问题读的方法对了那就不存在这一系列问题了。
而你要解决这一系列问题其实就是依靠之前我们给大家讲的那套基于undo log版本链条以及ReadView实现的mvcc机制。
现在开始我们接下来要用一系列的篇幅来研究另外一个问题了那就是当有多个事务同时并发更新一行数据的时候不就是会有脏写的问题吗
我们之前讲过脏写是绝对不允许的那么这个脏写是靠什么防止的呢
说白了就是靠锁机制依靠锁机制让多个事务更新一行数据的时候串行化避免同时更新一行数据今天我们就先对数据库的锁机制做一个初步的入门讲解。
在MySQL里假设有一行数据摆在那儿不动此时有一个事务来了要更新这行数据这个时候他会先琢磨一下看看这行数据此时有没有人加锁
一看没人加锁太好了说明他是第一个人捷足先登了。
此时这个事务就会创建一个锁里面包含了自己的trx_id和等待状态然后把锁跟这行数据关联在一起。
同时大家应该还记得更新一行数据必须把他所在的数据页从磁盘文件里读取到缓存页里来才能更新的所以说此时这行数据和关联的锁数据结构都是在内存里的大家要明确这一点如下图。 大家注意看上面的那个图因为事务A给那行数据加了锁所以此时就可以说那行数据已经被加锁了
那么既然被加锁了此时就不能再让别人访问了如果有朋友对加锁的概念不了解可能是对编程语言不太了解其实这个就跟Java里的加锁是一个概念。
现在呢有另外一个事务B过来了这个事务B就也想更新那行数据此时就会检查一下当前这行数据有没有别人加锁
然而他一下子发现真是糟糕啊事务A这家伙太不地道了居然抢先给这行数据加锁了这怎么办呢
事务B这个时候一想那行我也加个锁然后等着排队不就得了这个时候事务B也会生成一个锁数据结构里面有他的trx_id还有自己的等待状态但是他因为是在排队等待所以他的等待状态就是true了意思是我在等着呢如下图。 接着事务A这个时候更新完了数据就会把自己的锁给释放掉了。锁一旦释放了他就会去找此时还有没有别人也对这行数据加锁了呢他会发现事务B也加锁了
于是这个时候就会把事务B的锁里的等待状态修改为false然后唤醒事务B继续执行此时事务B就获取到锁了如下图。 上述就是MySQL中锁机制的一个最基本的原理大家可以先好好理解一下其实是跟Java里的锁机制思路是完全类似的从这种简单的锁里可以引申出很多其他的概念比如读写锁共享锁独占锁公平锁非公平锁等等。Java里的锁也同样具备这些锁的概念。