美文网首页公众号:阿区先生MySQL&&Redis
MySQL 面试系列:MySQL 中锁的面试题总结

MySQL 面试系列:MySQL 中锁的面试题总结

作者: you的日常 | 来源:发表于2020-11-27 18:17 被阅读0次

    其它MySQL 面试系列:

    MySQL 面试系列:MySQL查询如何进行优化?

    MySQL 面试系列:一条select语句在MySQL是这样执行的?
    MySQL 面试系列:MySQL 常见的开放性问题
    MySQL 面试系列:MySQL 性能优化 & 分布式

    MySQL 面试系列:MySQL 命令和内置函数
    MySQL 面试系列:MySQL 中日志的面试题总结
    MySQL 面试系列:MySQL 中锁的面试题总结

    MySQL 面试系列:MySQL 事务的面试题总结
    MySQL 面试系列:MySQL 索引的面试题总结
    MySQL 面试系列:MySQL 基础模块的面试题总结


    什么是锁?MySQL 中提供了几类锁?

    锁是实现数据库并发控制的重要手段,可以保证数据库在多人同时操作时能够正常运行。MySQL 提供了全局锁、行级锁、表级锁。其中 InnoDB 支持表级锁和行级锁,MyISAM 只支持表级锁。

    什么是死锁?

    是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的过程称为死锁。

    死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的过程称为死锁。

    常见的死锁案例有哪些?

    将投资的钱拆封几份借给借款人,这时处理业务逻辑就要把若干个借款人一起锁住 select * from xxx where id in (xx,xx,xx) for update。
    批量入库,存在则更新,不存在则插入。解决方法 insert into tab(xx,xx) on duplicate key update xx='xx'。

    如何处理死锁?

    对待死锁常见的两种策略:

    通过 innodblockwait_timeout 来设置超时时间,一直等待直到超时;
    发起死锁检测,发现死锁之后,主动回滚死锁中的某一个事务,让其它事务继续执行。

    如何查看死锁?

    使用命令 show engine innodb status 查看最近的一次死锁。
    InnoDB Lock Monitor 打开锁监控,每 15s 输出一次日志。使用完毕后建议关闭,否则会影响数据库性能。

    如何避免死锁?

    为了在单个 InnoDB 表上执行多个并发写入操作时避免死锁,可以在事务开始时通过为预期要修改的每个元祖(行)使用 SELECT … FOR UPDATE 语句来获取必要的锁,即使这些行的更改语句是在之后才执行的。
    在事务中,如果要更新记录,应该直接申请足够级别的锁,即排他锁,而不应先申请共享锁、更新时再申请排他锁,因为这时候当用户再申请排他锁时,其他事务可能又已经获得了相同记录的共享锁,从而造成锁冲突,甚至死锁
    如果事务需要修改或锁定多个表,则应在每个事务中以相同的顺序使用加锁语句。在应用中,如果不同的程序会并发存取多个表,应尽量约定以相同的顺序来访问表,这样可以大大降低产生死锁的机会通过 SELECT … LOCK IN SHARE MODE 获取行的读锁后,如果当前事务再需要对该记录进行更新操作,则很有可能造成死锁。
    改变事务隔离级别。
    InnoDB 默认是如何对待死锁的?
    InnoDB 默认是使用设置死锁时间来让死锁超时的策略,默认 innodblockwait_timeout 设置的时长是 50s。

    如何开启死锁检测?

    设置 innodbdeadlockdetect 设置为 on 可以主动检测死锁,在 Innodb 中这个值默认就是 on 开启的状态。

    什么是全局锁?它的应用场景有哪些?
    全局锁就是对整个数据库实例加锁,它的典型使用场景就是做全库逻辑备份。 这个命令可以使整个库处于只读状态。使用该命令之后,数据更新语句、数据定义语句、更新类事务的提交语句等操作都会被阻塞。

    什么是共享锁?

    共享锁又称读锁 (read lock),是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁。当如果事务对读锁进行修改操作,很可能会造成死锁。

    什么是排它锁?

    排他锁 exclusive lock(也叫 writer lock)又称写锁。

    若某个事物对某一行加上了排他锁,只能这个事务对其进行读写,在此事务结束之前,其他事务不能对其进行加任何锁,其他进程可以读取,不能进行写操作,需等待其释放。

    排它锁是悲观锁的一种实现,在上面悲观锁也介绍过。

    相关文章

      网友评论

        本文标题:MySQL 面试系列:MySQL 中锁的面试题总结

        本文链接:https://www.haomeiwen.com/subject/inpebktx.html