mysql innodb locks_关于MySQL的锁和InnoDB Lock

本文深入解析MySQL中的锁机制,包括四种锁类型(表锁、行锁、页锁及元数据锁),并探讨了InnoDB存储引擎下锁的具体实现形式与特点,如共享锁与排他锁等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

67935f65f47221b0df7174b4c12fd06e.png

实验环境

MySQL 5.7.21 on docker^1

主要内容

MySQL LockInnoDB LockDeadlock

MySQL中四种类型的锁

Table, 表锁Row, 表锁Page, 页锁Matedata, 元数据锁

其中,page lock only in BDB storage engine.

Metadata Lock

检查锁状态

mysql -uroot -e "show processlist\G" | tee processlist.logmysql -uroot -e "show engine innodb status\G" | tee innodb-status.log

关键参数

锁超时, lock_wait_timeout,默认值31536000s(1year)

InnoDB Lock

两个特点支持事务行级锁四个问题更新丢失, Lost Update脏读, Dirty Reads不可重复读, Non-Repeatable Reads幻读, Phantom Reads两个级别InnoDB Row Lock, InnoDB行锁InnoDB Table Lock, InnoDB表锁四种实现形式共享锁排他锁意向共享锁意向排他锁

检查InnoDB Lock状态

02:25:53 (root@localhost) [(none)]> show status like 'innodb_row_lock%';+-------------------------------+-------+| Variable_name | Value |+-------------------------------+-------+| Innodb_row_lock_current_waits | 0 || Innodb_row_lock_time | 0 || Innodb_row_lock_time_avg | 0 || Innodb_row_lock_time_max | 0 || Innodb_row_lock_waits | 0 |+-------------------------------+-------+5 rows in set (0.00 sec)

select * from information_schema.innodb_locks\Gselect * from information_schema.innodb_lock_waits\Gselect * from information_schema.innodb_trx\G-- processlistSHOW FULL PROCESSLIST;

InnoDB Row Lock

InnoDB实现的两种类型行锁

S Lock (Shared lock, 共享锁)X Lock (Exclusive lock, 排他锁)

一般来说,读写操作的锁不同。读锁(或叫共享锁)允许并发线程读取加锁的数据,但禁止写数据。相反,写锁(或叫排他锁)阻止其他线程的读写操作。

InnoDB行锁的三种算法

Record lockGap lockNext-key lock:Record Lock + Gap Lock, 锁定一个范围,并且锁定记录本身

如果不通过索引条件检索数据,那么InnDB将对表中的所有记录加锁,实际效果跟表锁一样!SQL优化或是检查锁的时候,还需要注意表数据量和相关SQL语句的索引(explain)使用状况。对于键值在条件范围内但不存在的记录,叫“间隙(GAP)”。

InnoDB Table Lock

InnoDB内部使用的两种表级意向锁(Intention Lock)

IS, Intention Share Lock, 意向共享锁IX, Intention Exclusive Lock, 意向排他锁

Reference

https://bugs.mysql.com/bug.php?id=989MySQL排错指南 Chapter 2深入浅出MySQL Chapter 20 锁问题深入浅出MySQL Chapter 20.3.9 关于死锁https://dev.mysql.com/doc/refman/5.7/en/innodb-deadlock-detection.htmlhttps://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html

Footnotes

https://shawn0915.github.io/mysql/2018/02/20/mysql-lock.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值