MySQL锁大全(一)

根据加锁的范围,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值