数据库并发处理 - 上的一把好"锁"
为什么要有锁? 我们都是知道,数据库中锁的设计是解决多用户同时访问共享资源时的并发问题。在访问共享资源时,锁定义了用户访问的规则。根据加锁的范围,MySQL 中的锁可大致分成全局锁,表级锁和行锁三类。在本篇文章中,会依次介绍三种类型的锁。在阅读本篇文章后,应该掌握如下的内容: 为什么要在备份时使用全局锁? 为什么推荐使用 InnoDB 作为引擎进行备份? 设置全局只读的方法 表级锁的两种类型 MDL 导致数据库挂掉的问题 如何利用两段锁协议减少锁冲突 如何解决死锁 对于热点表,如何避免死锁检测的损耗? 全局锁 什么是全局锁? 全局锁会让整个库处于只读状态,其他线程语句(DML,DDL,更新事务类)的语句都被会阻塞。 使用全局锁的场景 在做全库逻辑备份时,会把整库进行 select 然后保存成文本。 为什么要使用全局锁? 想象这样一个场景,要备份一个购买系统,其中购买操作设计到更新账号余额表和用户课程表。 现在进行逻辑备份,在备份过程中,一位用户购买了一门课程,这时需要在余额表扣掉余额,然后在购买的课程中加上一门课。正确的顺序肯定是先进行购买操作,减少余额和增加课程然后在进行备份。但却有可能出现这样的问题: 如果在时间顺序上先备份余额表 (u_account),然后用户购买(操作两张表),再备份用户课程表(u_course)? 这时用备份的数据做恢复时,会发现用户没花钱却买了一堂课