首页 > 社交 > 科普中国

面渣逆袭:MySQL六十六问,两万字+五十图详解!有点六

常驻编辑 科普中国 2022-06-22 字段   路由   详解   索引   事务   版本   操作   数据库   引擎   数据   日志
70s拜客生活常识网

假如没有意向锁,那么我们就得遍历表中所有数据行来判断有没有行锁;70s拜客生活常识网

有了意向锁这个表级锁之后,则我们直接判断一次就知道表中是否有数据行被锁定了。70s拜客生活常识网

有了意向锁之后,要执行的事务A在申请行锁(写锁)之前,数据库会自动先给事务A申请表的意向排他锁。当事务B去申请表的互斥锁时就会失败,因为表上有意向排他锁之后事务B申请表的互斥锁时会被阻塞。70s拜客生活常识网

70s拜客生活常识网

意向锁70s拜客生活常识网

46.MySQL的乐观锁和悲观锁了解吗?

  • 悲观锁(Pessimistic Concurrency Control):

悲观锁认为被它保护的数据是极其不安全的,每时每刻都有可能被改动,一个事务拿到悲观锁后,其他任何事务都不能对该数据进行修改,只能等待锁被释放才可以执行。70s拜客生活常识网

数据库中的行锁,表锁,读锁,写锁均为悲观锁。70s拜客生活常识网

  • 乐观锁(Optimistic Concurrency Control)

乐观锁认为数据的变动不会太频繁。70s拜客生活常识网

乐观锁通常是通过在表中增加一个版本(version)或时间戳(timestamp)来实现,其中,版本最为常用。70s拜客生活常识网

事务在从数据库中取数据时,会将该数据的版本也取出来(v1),当事务对数据变动完毕想要将其更新到表中时,会将之前取出的版本v1与数据中最新的版本v2相对比,如果v1=v2,那么说明在数据变动期间,没有其他事务对数据进行修改,此时,就允许事务对表中的数据进行修改,并且修改时version会加1,以此来表明数据已被变动。70s拜客生活常识网

如果,v1不等于v2,那么说明数据变动期间,数据被其他事务改动了,此时不允许数据更新到表中,一般的处理办法是通知用户让其重新操作。不同于悲观锁,乐观锁通常是由开发者实现的。70s拜客生活常识网

47.MySQL 遇到过死锁问题吗,你是如何解决的?

排查死锁的一般步骤是这样的:70s拜客生活常识网

(1)查看死锁日志 show engine innodb status;70s拜客生活常识网

(2)找出死锁 sql70s拜客生活常识网

(3)分析 sql 加锁情况70s拜客生活常识网

(4)模拟死锁案发70s拜客生活常识网

(5)分析死锁日志70s拜客生活常识网

(6)分析死锁结果70s拜客生活常识网

当然,这只是一个简单的流程说明,实际上生产中的死锁千奇百怪,排查和解决起来没那么简单。70s拜客生活常识网

事务

48.MySQL 事务的四大特性说一下?

相关阅读:

  • 字段类型有哪些(字段长度怎么设置)
  • 技术人必备的接口测试神器:apifox、apipost、yapi,实用
  • 我做开发测试犯的错
  • 基于SpringBoot微服务开发中的异常处理最佳实践
  • MySQL专题1:
  • 你今天玩游戏了吗?游戏道具了解下
  • 什么是CSRF
  • 最全SQL
  • 云原生(十四)
  • MySQL索引原理篇:深入数据库底层揭开索引机制的神秘面
    • 网站地图 |
    • 声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不做权威认证,如若验证其真实性,请咨询相关权威专业人士。