根据加锁的范围,MySQL 里面的锁大致可以分成
1)全局锁
2)表级锁(事务意向锁)
3)行锁
MySQL锁本质是锁索引记录(index record lock) ,RR/RC模式下锁与索引
--在RR模式下,由于存在间隙机制,如果表中没有索引,则会构造索引,行锁ix也会成为gap锁
--在RC模式下,由于禁用间隙锁机制,如果表中没有索引,也会构造索引,但是行锁ix不会gap锁定,行锁仅锁定一行记录;gap锁仅用于外键检查以及重复值检查;
--Shared and Exclusive Locks
--Intention Locks
--Record Locks(锁定精确记录,1个或者多个记录)
--Gap Locks(锁定记录范围区间,区间范围dml)
--Next-Key Locks(Record Lock + GAP Lock)
--Insert Intention Locks
--AUTO-INC Locks
--Predicate Locks for Spatial Indexes
1.查看innodb锁状态信息
Innodb lock moinitor
Enabling the InnoDB Lock Monitor
InnoDB Lock Monitor data is printed with the InnoDB Standard Monitor output. Both the InnoDB Standard Monitor and InnoDB Lock Monitor must be enabled to have InnoDB Lock Monitor data printed periodically.
To enable the InnoDB Lock Monitor, set the innodb_status_output_locks system variable to ON. Both the InnoDB standard Monitor and InnoDB Lock Monitor must be enabled to have InnoDB Lock Monitor data printed periodically:
SET GLOBAL innodb_status_output=ON;
SET GLOBAL innodb_status_output_locks=ON;
全局锁就是对整个数据库实例加锁
1.MySQL 提供了一个加全局读锁的方法(MyISAM)
Flush tables with read lock (FTWRL)
FTWRL全局枷锁将数据块处于只读状态
FLUSH TABLES WITH READ LOCK acquires a global read lock and not table locks, so it is not subject to the same behavior as LOCK TABLES and UNLOCK TABLES with respect to table locking and implicit commits. For example, START TRANSACTION does not release the global read lock
解锁办法:
unlock tables;
2.全局锁的典型使用场景(Inodb):
全库逻辑备份
FTWRL 确保不会有其他线程对数据库做更新,然后对整个库做备份。注意,在备份过程中整个库完全处于只读状态。如果在全库逻辑备份时刻不加锁的话,备份系统备份的得到的库不是一个逻辑时间点,这个视图是逻辑不一致的。
MySQL官方自带的逻辑备份工具是 mysqldump。当 mysqldump 使用参数–single-transaction 的时候,导数据之前就会启动一个事务,来确保拿到一致性视图;而由于 MVCC 的支持,这个过程中数据是可以正常更新的。
一致性读是好,但前提是引擎要支持这个隔离级别。比如,对于 MyISAM 这种不支持事务的引擎,如果备份过程中有更新,总是只能取到最新的数据,那么就破坏了备份的一致性。这时,我们就需要使用 FTWRL 命令了。
这往往是 DBA 要求业务开发人员使用 InnoDB 替代 MyISAM 的原因之一。
示例:ftwrl全局读锁后,数据块处于静止只读一致性状态,无法dml
mysql> create table t_ftwrl(id int);
ERROR 1223 (HY000): Can't execute the query because you have a conflicting read lock
mysql>
mysql> insert into t1 values(1);
ERROR 1223 (HY000): Can't execute the query because you have a conflicting read lock
MySQL锁大全(一)
最新推荐文章于 2024-11-12 20:35:48 发布