这是一道经典的程序员面试题,在Mysql中,如果有多个事务同时访问同一行数据,那么需要加锁么?我们都知道,在Mysql中有行锁,如果有多个事务同时修改同一行数据,那么需要加锁来防止并发问题。那么,如果有事务修改数据,又有事务读取这个数据,需要加锁么?

答案是不一定,事实上,Mysql的很多数据库引擎为了提升并发性能,都做了多版本并发控制,也就是我们常说的MVCC,事实上,除了Mysql,其他知名的关系型数据库,例如Oracle,PostgreSql也实现了多版本并发控制,尽管实现方式各不相同,但是他们的本质为了实现非阻塞读,也就是即便是这一行数据在做变更的时候,也能被读取到。

那么,Mysql是如何实现MVCC的呢?在Mysql的每一行数据中,除了我们定义的数据列,还有2个隐藏的列,一个是数据的变更时间,一个是这行数据的删除时间,当然,这个时间并不是简单的时间戳,而是一个严格递增的系统版本号。

当InnoDB发生Insert事件的时候,会插入当前行并且以取得的系统版本号作为数据版本号。

当InnoDB发生Delete时间的时候,不会删除当前行,而是把对应的行如果未删除,那么打上删除标记位为当前的版本号。

当InnoDB发生Select操作的时候,会取当前的系统版本号,然后到数据库中进行查询,他只会查询比自己当前版本号更小的,并且没有删除版本号或者删除版本号比当前版本号更小的数据。

当InnoDB发生Update事件的时候,不是直接更新旧的数据,而是插入一条新的数据,并且把版本号小于这条记录的并且没有被打上删除标记的同一主键的记录更新打上删除标记,删除版本号为当前的版本号。

很显然,在这样的一种数据中,同一行数据其实在数据库中是多行的存在。这本质上是一种空间换时间的方案,在多版本控制中,我们几乎可以做到所有的读操作都是无阻塞的,可以避免加锁,这与互联网业务中,多读少写是非常契合的。当然了,在Mysql的InnoDB引擎中,只有事务级别为可重复读跟读提交才可以使用。这是为什么呢?

【编辑推荐】

【责任编辑:华轩 TEL:(010)68476606】

点赞 0

mysql会对同时读取加锁吗_程序员经典面试题,MySQL并发读写的时候,都是需要加锁的么?...相关推荐

  1. mysql 自增 不是主键_程序员经典面试题,MySQL自增主键为什么不连续

    在我们日常使用Mysql中,如果不是特殊的业务需要,一般我们都会使用自增主键,自增主键的好处可以在插入的时候尽量地减少页分割,增加Mysql的写入效率.我们有时候就会发现,自增主键并不是连续递增的,为 ...

  2. 小郭经典mysql面试题资料_程序员经典面试题,Mysql是如何完成一次数据查询的...

    数据库,大家都不陌生,这是程序员的基本技能了.当然,我们更多时候只是去了解如何使用数据库,而对数据库一些底层原理却比较陌生,今天我们来了解一下,一条数据库查询语句的取经之路. 基本分层 个人认为,My ...

  3. 主键冲突报什么代码_程序员经典面试题,Mysql自增主键为什么不连续

    在我们日常使用Mysql中,如果不是特殊的业务需要,一般我们都会使用自增主键,自增主键的好处可以在插入的时候尽量地减少页分割,增加Mysql的写入效率.我们有时候就会发现,自增主键并不是连续递增的,为 ...

  4. 语言做的表白魔方_程序员表白教程,这些代码用过的都说浪漫

    作为一名程序员,如何用自己的技术向喜欢的人表白? 这篇程序员表白教程,可以让你创造出不一样的浪漫! 你值得拥有! 1. I Love You Batch le 不如送她一个惊喜? 让她的电脑自动关机, ...

  5. mysql中decimal不能为空吗_程序员,知道Mysql中事务ACID的原理吗?

    点击上方"linkoffer", 选择关注公众号高薪职位第一时间送达 引言 照例,我们先来一个场景~ 面试官:"知道事务的四大特性么?" 你:"懂,A ...

  6. python程序员幽默段子_程序员的十个段子,能看懂的都是深有同感!

    作为程序员那么久,总结了如下10个段子,能看懂的,背后应该都有着不为人知的故事~~~~ 一:程序员最痛苦的莫过于两件事,第一件就是要给别人写文档......第二件就是别人遗留的产品为什么没有文档~!! ...

  7. 程序员搞笑对联_程序员经典幽默已经上升到搞对联的逼格了

    很多人对我们程序员大神,始终抱着这样的成见,"程序员这种死板的生物怎么可能会写对联." 殊不知,我们程序员大神,看到别人这样恶搞自己也不免会淡淡的一笑,哎,苦逼的程序员.当然,更多 ...

  8. gb2312编码表_程序员趣味读物:谈谈Unicode编码

    点击上方"智能与算法之路",选择"星标"公众号 资源干货,第一时间送达 这是一篇程序员写给程序员的趣味读物.所谓趣味是指可以比较轻松地了解一些原来不清楚的概念, ...

  9. java中级程序员面试题_中级Java程序员常见面试题汇总

    下面是一些中级Java程序员常见面试题汇总,你可以用它来好好准备面试. 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器 ...

最新文章

  1. 这个五月,我拿到了腾讯暑期offer
  2. python选课系统_【精选】在Monash读Data Science,人人都拥有这样一份选课指南。
  3. 悲催的中国式项目开发
  4. (chap5 web服务器) 数据转发之“代理”
  5. RabbitMQ(二):Work Queues、循环分发、消息确认、持久化、公平分发
  6. leetcode713. 乘积小于K的子数组(双指针)
  7. 案例演示按角色的form认证实现过程
  8. 从零基础到精通的前端学习路线
  9. #运算符、不同的指针类型、数组和指针、指针运算、堆、栈、静态区、只读区、下标VS指针...
  10. java同步队列_Java 中队列同步器 AQS(AbstractQueuedSynchronizer)实现原理
  11. async与defer
  12. linux 安装weblogic12.1.3.0步骤
  13. Http实战之Wireshark抓包分析
  14. n皇后问题-c语言实现
  15. java读取 文件_Java读取文件的简单实现方法
  16. 区块链还有多长的路要走
  17. Spring Boot项目实例——简易版商城管理系统
  18. 2个大厂 100亿级 超大流量 红包 架构方案
  19. Android 全埋点方案盘点
  20. 智能对话之对话管理综述

热门文章

  1. php 预防循环发短信_php短信接口发送短信失败,罪魁祸首原来在这里
  2. python json文件传输图片
  3. python中前后端通信方法Ajax和ORM映射(form表单提交)
  4. Delphi TXLSReadWriteII导出Excel
  5. centos uninstall teamviewer11
  6. NOIP2014 uoj20解方程 数论(同余)
  7. C# 泛型的协变和逆变
  8. Springmvc跨服务器文件上传报403,409错误
  9. CSS hr修改样式
  10. phpMyAdmin4.4.10安装