概述
多个进程或者线程并发访问同一个资源的机制,如何保证数据被并发访问时的一致性有效性是所有数据库必须要面对的一个问题
同时锁冲突也是影响着数据库性能的一个重要因素
全局锁
介绍
全局锁就是对整个数据库实例加锁, 加锁之后的整个实例就处于只读状态, 后续的DML的写语句, DDL语句, 已经更新操作的事务提交语句都将被阻塞.
其典型的使用场景就是做全局的逻辑备份, 对所有的表进行锁定, 从而获取一致性视图, 保证数据的完整性.
说白了就是, 备份的数据有了订单信息, 有了订单日志,却没有减少相应的库存.
也就是说,加上了全局锁之后,备份的数据才有数据一致性,因为之后DQL的语句能操作。
通过全局锁, 进行数据的备份
flush tables with read lock;
加上全局锁
mysqldump -hIP地址 -uroot -proot 数据库名 > 文件名.sql
进行数据的备份。注意这个命名不需要进入数据库,是在windows的命令行下执行
unlock tables;
解锁
表级锁
锁着一张表,在mylsam,innodb等存储引擎中
锁的粒度大,并发能力很低
对于表锁,分为两类:
- 表共享读锁(read lock)
也称为读锁:直到释放之前,其他别写了 - 表独占写锁 (write lock)
也称为写锁,加上这个,直到释放之前,其他连读都不行,更别说写了
语法
加锁
lock tables 表名 read/write
释放锁
unlock tables
元数据锁
MDL
系统自动控制,无需命令
mdl作用是维护一张表的数据一致性,在表上有事务在活动的时候,不可以进行写操作。
在mysql5.5版本时
就已经加上了这个锁
当对一张表进行DML和DQL时,加上读锁,当对表的结构操作时,加上写锁
意向锁
行级锁
应用在innodb存储引擎中
innodb的数据是基于索引组织的,行锁是通过在索引上的索引项加锁来实现的,而不是对记录来加锁
主要分两种类型
共享锁
意思就是,当一行数据被一个事务先加上了共享锁,那么这个时候,替他事务只能来读数据,但是获取不到这个行的排他锁
排他锁
意思就是,事务只有获取到某一行的排他锁,才能够更新该行的数据,除了这个行的排他锁的拥有者事务,其他事务都得等着,不能读更别说写