本文作者:kris

mysql中锁机制的最全面讲解-mysql锁机制详解

kris 2025-02-02 12:48:04 2
mysql中锁机制的最全面讲解-mysql锁机制详解摘要: mysql有一条sql语句导致一直锁表,怎么解决?-- 查看那些表锁到了show OPEN TABLES where In_use > 0;-- 查看进程号show...

mysql有一条sql语句导致一直锁表,怎么解决?

-- 查看那些表锁到了show OPEN TABLES where In_use > 0;-- 查看进程号show processlist;--删除进程kill 1085850;

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 表上的行锁等待。

mysql中锁机制的最全面讲解-mysql锁机制详解

图片来源:网络

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

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

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

mysql有哪几种锁?

MySQL中有以下几种锁:

乐观锁:假设并发操作时不会发生冲突,只在提交事务时检查数据是否被其他事务修改过。常用于读多写少的场景。

悲观锁:假设并发操作时会发生冲突,因此在操作期间持有锁来避免冲突。常用于写多读少的场景。

全局锁:对整个数据库实例加锁,限制除了超级用户外的所有查询和修改操作。一般用于备份、恢复等操作。

表级锁:对整个表加锁,其他连接无法修改或读取该表的数据,但可以对其他表进行操作。

页级锁:对数据页(通常是连续的几个数据块)加锁,其他连接可以读取该表的数据,但是不能修改。

行级锁:对某一行加锁,阻止其他连接对该行的读取和修改操作。

共享锁:多个事务可以同时读取某一条记录,但是不能进行修改。

排他锁:也称为独占锁,只有一个事务能读取或修改数据记录。

mysql只从同步会锁吗?

在MySQL中,同步会导致锁定,因为同步需要在主数据库上执行写操作,这可能会导致锁定表或行。当同步完成并且从服务器已经从主服务器复制了所有更改时,锁定将被释放。为了避免长时间锁定,可以考虑使用基于GTID的异步复制,这可以减少锁定的时间并提高性能。

mysql锁表严重?

导致锁表的原因

1、锁表发生在insert  update 、delete 中;  

2、锁表的原理是 数据库使用独占式封锁机制,当执行上面的语句时,对表进行锁住,直到发生commite 或者 回滚 或者退出数据库用户; 

3、A程序执行了对 tableA 的 insert ,并还未 commite时,B程序也对tableA 进行insert 则此时会发生资源正忙的异常 就是锁表;

 4、锁表常发生于并发而不是并行(并行时,一个线程操作数据库时,另一个线程是不能操作数据库的,cpu 和i/o 分配原则)。

 

文章版权及转载声明

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

阅读
分享