MySQL如何加锁避免并发事务导致的脏写?

Posted JavaEdge.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL如何加锁避免并发事务导致的脏写?相关的知识,希望对你有一定的参考价值。

多个事务同时并发更新一行数据时, 就有脏写问题。脏写绝对不允许,可依靠锁机制让多个事务更新一行数据的时候串行化,避免同时更新一行数据。

有个事务要来更新一行数据,他会先看这行数据有没有人加锁?看到没人加锁,该事务就会创建一个锁,包含自己的trx_id和等待状态,然后把锁跟这行数据关联在一起。

更新一行数据,必须将其所在数据页从磁盘文件读到缓存页才能更新,所以此时这行数据和关联的锁的数据结构,都在内存。

因为事务A给那行数据加了锁,所以此时该数据被加锁。就不能再让别人访问了!

此时事务B也想更新那行数据,就检查当前这行数据是否被别人加锁,然后发现事务A抢先给这行数据加锁了,这可咋办?

事务B想,那我也加个锁,大不了等着排队呗,于是事务B也会生成一个锁数据结构,有其trx_id和等待状态,但因为在排队,所以等待状态就是true:

事务A这时更新完了数据,就会释放锁。锁一旦释放,他就会去找,此时还有无别人对这行数据也加锁了呢?他发现事务B也加锁了。于是,就会把事务B的锁里的等待状态修改为false,然后唤醒事务B继续执行,此时事务B就获取到锁了:

以上是关于MySQL如何加锁避免并发事务导致的脏写?的主要内容,如果未能解决你的问题,请参考以下文章

mysql中的各种锁把我搞糊涂啦~

深入理解Mysql事务隔离级别与锁机制

Python进阶篇:MySQL隔离级别详解

Python进阶篇:MySQL隔离级别详解

Python进阶篇:MySQL隔离级别详解

MySQL锁小结