MySQL如何加锁避免并发事务导致的脏写?
2023-09-27 14:19:47 时间
多个事务同时并发更新一行数据时, 就有脏写问题。脏写绝对不允许,可依靠锁机制让多个事务更新一行数据的时候串行化,避免同时更新一行数据。
有个事务要来更新一行数据,他会先看这行数据有没有人加锁?看到没人加锁,该事务就会创建一个锁,包含自己的trx_id和等待状态,然后把锁跟这行数据关联在一起。
更新一行数据,必须将其所在数据页从磁盘文件读到缓存页才能更新,所以此时这行数据和关联的锁的数据结构,都在内存。
因为事务A给那行数据加了锁,所以此时该数据被加锁。就不能再让别人访问了!
此时事务B也想更新那行数据,就检查当前这行数据是否被别人加锁,然后发现事务A抢先给这行数据加锁了,这可咋办?
事务B想,那我也加个锁,大不了等着排队呗,于是事务B也会生成一个锁数据结构,有其trx_id和等待状态,但因为在排队,所以等待状态就是true:
事务A这时更新完了数据,就会释放锁。锁一旦释放,他就会去找,此时还有无别人对这行数据也加锁了呢?他发现事务B也加锁了。于是,就会把事务B的锁里的等待状态修改为false,然后唤醒事务B继续执行,此时事务B就获取到锁了:
相关文章
- Mysql加锁过程详解(5)-innodb 多版本并发控制原理详解
- mysql特定字段读
- Linux下的Mysql安装 & 配置
- DataX-MySQL(读写)
- 【MySQL】Mysql 日志
- MySQL并发复制系列三:MySQL和MariaDB实现对比
- mysql并发写入性能分析
- mysql数据库使用错误<errno:13>
- MySQL存储引擎
- Python使用pyMysql模块插入数据到mysql的乱码解决
- 《PHP、MySQL和Apache入门经典(第5版)》一2.11 实践练习
- 转 mysql的恢复过程非常慢
- MySQL并发相关的参数
- MySQL利用xtrabackup在线修复或新增从库
- 如何在mysql下实现事务的提交与回滚
- Mysql并发时经典常见的死锁原因及解决方法
- MySQL Proxy 实现 MySQL 读写分离提高并发负载
- MySQL修改root密码的各种方法整理
- 数据库原理及MySQL应用 | 并发控制
- 黄金法则:MySQL基准测试最佳实践
- python操作mysql数据库
- mysql如何下载历史版本?
- 【MySQL】常用语句
- MySQL读写分离
- 从mysql高可用架构看高可用架构设计
- MySQL DELETE语句和TRUNCATE TABLE语句的区别