本文作者:kris

MySQL行级锁、表级锁、页级锁详细介绍-mysql行级锁与表级锁

kris 2025-01-31 14:00:04 2
MySQL行级锁、表级锁、页级锁详细介绍-mysql行级锁与表级锁摘要: mysql数据库的行级锁有几种?1. 程序中非数据库交互操作导致事务挂起将接口调用或者文件操作等这一类非数据库交互操作嵌入在 SQL 事务代码之中,那么整个事务很有可能因此挂起(接...

mysql数据库的行级锁有几种?

1. 程序中非数据库交互操作导致事务挂起

将接口调用或者文件操作等这一类非数据库交互操作嵌入在 SQL 事务代码之中,那么整个事务很有可能因此挂起(接口不通等待超时或是上传下载大附件)。

2. 事务中包含性能较差的查询 SQL

事务中存在慢查询,导致同一个事务中的其他 DML 无法及时释放占用的行锁,引起行锁等待。

3. 单个事务中包含大量 SQL

通常是由于在事务代码中加入 for 循环导致,虽然单个 SQL 运行很快,但是 SQL 数量一大,事务就会很慢。

4. 级联更新 SQL 执行时间较久

这类 SQL 容易让人产生错觉,例如:update A set ... where ...in (select B) 这类级联更新,不仅会占用 A 表上的行锁,也会占用 B 表上的行锁,当 SQL 执行较久时,很容易引起 B 表上的行锁等待。

5. 磁盘问题导致的事务挂起

极少出现的情形,比如存储突然离线,SQL 执行会卡在内核调用磁盘的步骤上,一直等待,事务无法提交。

MySQL行级锁、表级锁、页级锁详细介绍-mysql行级锁与表级锁

图片来源:网络

综上可以看出,如果事务长时间未提交,且事务中包含了 DML 操作,那么就有可能产生行锁等待,引起报错。

如何查询mysql中是否表被锁?

1、查询是否锁表

show OPEN TABLES where In_use > 0;

2、查询进程

show processlist

查询到相对应的进程===然后 kill id

补充:

查看正在锁的事务

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

查看等待锁的事务

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

mysql插入数据会锁表吗?

在MySQL中,插入数据通常不会锁表。MySQL使用了多版本并发控制(MVCC)来处理并发操作,这意味着读取和写入操作可以同时进行而不会相互阻塞。当插入数据时,MySQL会在表中的合适位置插入新的行,而不会锁定整个表。但是,如果有其他事务正在修改同一行或同一范围的行,那么插入操作可能会被阻塞,直到其他事务完成。

此外,如果表使用了特定的锁定级别(如写锁定),则插入操作可能会锁定整个表。

因此,要确保插入操作不会锁定表,可以使用合适的索引、避免长事务和合理设置锁定级别。

1. 会锁表2. 因为在MySQL中,当进行数据插入操作时,会对表进行锁定,以确保数据的一致性和完整性。
这是为了防止其他用户同时对同一张表进行写操作,导致数据冲突和错误。
3. 当插入大量数据时,锁表的时间可能会比较长,这会影响其他用户对该表的读写操作。
为了避免锁表带来的性能问题,可以采取一些优化措施,如使用批量插入、分区表等技术来减少锁表的时间和影响。

mysql插入数据后还能有间隙锁吗?

有的。

mysql插入数据后,还能有间隙锁的。

因为,有些update/delete语句采用的是当前读,这会导致只有行锁的情况下,产生幻读,假设没有间隙锁,当前读中也会出现重复读的问题。

所以,mysql在rr隔离级别下解决幻读问题,采用的是行锁+间隙锁,两者合称next-key lock。

文章版权及转载声明

作者:kris本文地址:https://www.damoyx.com/p/29203.html发布于 2025-01-31 14:00:04
文章转载或复制请以超链接形式并注明出处大漠游侠网

阅读
分享