概述锁是计算机协调多个进程或纯线程并发访问某一资源的机制,这些资源包括CPU、内存、I/O等,而在数据库中,数据也是一种供许多用户(进程/线程)共享的资源 。如何保证数据并发访问的一致性、有效性是所在有数据库必须解决的一个问题,数据库的锁便是解决这个问题的重要工具 。数据库的事务具有4个属性,即ACID,其中C即是一致性,所以在数据库中,锁和事务总是息息相关的 。
MySQL中的锁在MySQL中,不同的存储引擎,可能支持的锁会有所不同 。下面的内容主要围绕使用比较多的InnoDB和MyISAM进行描述 。
MySQL中的锁,从粒度即范围划分为3类:全局锁、表级锁、行级锁 。实际上,其它的如BDB存储引擎还有页级锁,这里不做介绍 。
- 全局锁
FLUSH TABLES WITH READ LOCK;
释放全局锁命令如下UNLOCK TABLES;
此外,在客户端异常断开后,全局锁会自动释放 。全局锁的典型使用场景是,做全库逻辑备份(mysqldump) 。- 表级锁
相关表级锁的一些命令
-- 手动增加表锁(READ为共享读锁,WRITE为独占写锁)LOCK TABLE 表名 READ | WRITE;-- 查看表锁情况SHOW OPEN TABLES;-- 删除表锁UNLOCK TABLES;
表级锁从资源管理角度又分为表共享读锁(共享锁)和表独占写锁(排他锁)两种形式 。如果对数据表加了共享读锁,当前会话只能读取加锁的表数据,同时不能增删改(报错),也不能读取其它表数据;其它的会话则可以读取加锁的表数据,增删改将被阻塞,但可以操作其它表数据 。表共享读锁的演示
打开一个客户端会话1,对tdep表加共享读锁,会话1可以读取tdep表的数据,但不能进行增删改,同时也不能操作其它表 。
文章插图
会话1对tdep表加共享读锁的表现
此时打开另外一个客户端会话2,可以读取tdep表数据,对tdep表进行增删改将被阻塞,但可以操作其它数据表 。
文章插图
其它会话表现
表独占写锁演示
打开一个客户端会话1,对tdep表加独占写锁,会话1可以对tdep表进行增删改查,但依旧不可以操作其它表 。
文章插图
会话1对tdep表加独占写锁的表现
打开另外一个客户端会话2,会话可以操作其它数据表,但对tdep任何的操作包括select查询都会被阻塞 。
文章插图
其它会话的表现
查看表级锁定的争用状态
mysql> SHOW STATUS LIKE'table_locks%';+-----------------------+-------+| Variable_name| Value |+-----------------------+-------+| Table_locks_immediate | 99|| Table_locks_waited| 0|+-----------------------+-------+
其中table_locks_immediate表示产生表级锁定的次数;table_locks_waited表示出现表级锁定争用而发生等待的次数 。- 行级锁
InnoDB行锁是通过给索引上的索引项加锁来实现的,因此InnoDB这种行锁实现特点意味着:只有通过
索引条件检索的数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁(自动使用表锁,不需要人员干预)!
InnoDB的行级锁,按照锁定范围来说,分为三种:
记录锁(Record Locks),锁定索引中一条记录;间隙锁(Gap Locks),要么锁住索引记录中间的值,要么锁住第一个索引记录前面的值或者最后一个索引记录后面的值,其用于防止插入或更新间隙内的数据;Next-Key锁,是索引记录上的记录锁和在索引记录之前的间隙锁的组合 。
按照功能来说,分为两种:
推荐阅读
- 怎么优雅的选择 MySQL 存储引擎
- 数据实时同步之MongoDB
- 后端开发必备的 MySQL 日志文件知识点
- MySQL中一条SQL到底是如何执行的?
- Nacos数据持久化到MySQL
- MySQL 你可能忽视的选择问题
- 茶百科之莫干黄芽茶,莫干黄芽茶饮用禁忌
- 茶百科之太湖翠竹,太湖小天鹅品茶
- 茶的种类和功效是什么,茶文化之了解茶的功效
- 茶是健康之饮 你不应该因失眠而拒绝茶