网站首页 > 技术文章 正文
这是一道经典的程序员面试题,在Mysql中,如果有多个事务同时访问同一行数据,那么需要加锁么?我们都知道,在Mysql中有行锁,如果有多个事务同时修改同一行数据,那么需要加锁来防止并发问题。那么,如果有事务修改数据,又有事务读取这个数据,需要加锁么?
答案是不一定,事实上,Mysql的很多数据库引擎为了提升并发性能,都做了多版本并发控制,也就是我们常说的MVCC,事实上,除了Mysql,其他知名的关系型数据库,例如Oracle,PostgreSql也实现了多版本并发控制,尽管实现方式各不相同,但是他们的本质为了实现非阻塞读,也就是即便是这一行数据在做变更的时候,也能被读取到。
那么,Mysql是如何实现MVCC的呢?在Mysql的每一行数据中,除了我们定义的数据列,还有2个隐藏的列,一个是数据的变更时间,一个是这行数据的删除时间,当然,这个时间并不是简单的时间戳,而是一个严格递增的系统版本号。
当InnoDB发生Insert事件的时候,会插入当前行并且以取得的系统版本号作为数据版本号。
当InnoDB发生Delete时间的时候,不会删除当前行,而是把对应的行如果未删除,那么打上删除标记位为当前的版本号。
当InnoDB发生Select操作的时候,会取当前的系统版本号,然后到数据库中进行查询,他只会查询比自己当前版本号更小的,并且没有删除版本号或者删除版本号比当前版本号更小的数据。
当InnoDB发生Update事件的时候,不是直接更新旧的数据,而是插入一条新的数据,并且把版本号小于这条记录的并且没有被打上删除标记的同一主键的记录更新打上删除标记,删除版本号为当前的版本号。
很显然,在这样的一种数据中,同一行数据其实在数据库中是多行的存在。这本质上是一种空间换时间的方案,在多版本控制中,我们几乎可以做到所有的读操作都是无阻塞的,可以避免加锁,这与互联网业务中,多读少写是非常契合的。当然了,在Mysql的InnoDB引擎中,只有事务级别为可重复读跟读提交才可以使用。这是为什么呢?欢迎大家关注我,共同学习,共同进步。大家的支持是我继续唠嗑的动力。同名公众号(沙茶敏碎碎念)
猜你喜欢
- 2025-07-28 Windows远程桌面出现身份验证错误,由于CredSSP加密数据库修正
- 2025-07-28 MYSQL存储引擎InnoDB(八十):InnoDB静态数据加密
- 2025-07-28 VirtualBox 7.0正式发布:支持完整虚拟主机加密等
- 2025-07-28 C#与NodeJS互相实现DES加密解密(nodejs 加密解密)
- 2025-07-28 Ubuntu系统密码(root密码)的修改方法
- 2024-10-29 #6 SaaS的数据都要做哪些加密处理
- 2024-10-29 Oracle中泄露“天机”的TNS 李阳波泄露了什么天机
- 2024-10-29 浅析Shiro Padding Oracle Attack
- 2024-10-29 Oracle 20c 新特性:表空间缺省加密算法 (最新建议收藏)
- 2024-10-29 Oracle数据库勒索病毒死灰复燃 数据库勒索病毒处理
你 发表评论:
欢迎- 641℃几个Oracle空值处理函数 oracle处理null值的函数
- 631℃Oracle分析函数之Lag和Lead()使用
- 623℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 619℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 615℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 605℃【数据统计分析】详解Oracle分组函数之CUBE
- 596℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 580℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- 前端获取当前时间 (50)
- Oracle RAC (76)
- oracle恢复 (77)
- oracle 删除表 (52)
- oracle 用户名 (80)
- oracle 工具 (55)
- oracle 内存 (55)
- oracle 导出表 (62)
- oracle约束 (54)
- oracle 中文 (51)
- oracle链接 (54)
- oracle的函数 (58)
- 前端调试 (52)
本文暂时没有评论,来添加一个吧(●'◡'●)