mysql 锁相关知识
- 数据库级别
- 全局锁:锁整个数据库,不可写,只读
- 数据备份时,如果不加该锁,则可能导致数据不一致。
- 加锁:
flush tables with read lock;
- 解锁
unlock tables;
- 全局锁:锁整个数据库,不可写,只读
- 表级别
- 表锁:
- 表共享读锁(read lock):其他客户端不可写,只读
- 表独占写锁(write lock):其他客户端不可读写
- 加锁:lock tables 表名… read/write。
- 释放锁:unlock tables / 客户端断开连接 。
- 元数据锁:元数据-> 表结构数据
- 为防止在数据更新时,对元数据更新,系统自己加的锁。
查看锁情况
select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema.metadata_locks;
- 意向锁: 如果表有行锁,会自动加意向锁,为了减少表锁时候对每行检测是否具有行锁
- 意向共享锁(IS): 由
select ... lock in share mode
添加。与表锁共享锁(read)兼容,与表锁排他锁(write)互斥。 - 意向排他锁(IX): 由
insert、update、delete、select...for update
添加。与表锁共享锁(read)及排他锁(write)都互斥,意向锁之间不会互斥。
- 意向共享锁(IS): 由
查看锁情况:
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
- 表锁:
- 行级别
- 行锁: 锁定单个行记录的锁,防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持。
- 共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁。[SELECT … LOCK IN SHARE MODE 加S]
- 排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。 [INSERT,DELETE,UPDATE,SELECT … FOR UPDATE都会加X]
- InnoDB的行锁是针对于索引加的锁,不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,此时就会升级为表锁。
查看锁情况:
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_locks;
- 间隙锁: 锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读。在RR隔离级别下都支持。可多个事务共存间隙锁。
- 临键锁: 行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在RR隔离级别下支持。
- 向右遍历时最后一个值不满足查询需求时,next-key lock 退化为间隙锁。[锁最后一个值到无穷的间隙,防止事务过程中有数据插入]
InnoDB的B+树索引,叶子节点是有序的双向链表,所以最右侧没有数据说明,找不到符合条件的数据,所以要锁空白记录文章来源:https://www.toymoban.com/news/detail-471186.html
- 行锁: 锁定单个行记录的锁,防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持。
refer to https://juejin.cn/post/7208019379828621373文章来源地址https://www.toymoban.com/news/detail-471186.html
到了这里,关于mysql 锁相关知识的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!