首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >MySQL如何加锁避免并发事务导致的脏写?

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

作者头像
JavaEdge
发布于 2022-02-17 13:48:29
发布于 2022-02-17 13:48:29
1.7K0
举报
文章被收录于专栏:JavaEdgeJavaEdge

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

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

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

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

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/02/16 ,如有侵权请联系 cloudcommunity@tencent.com 删除
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档