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 表上的行锁等待。
图片来源:网络
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 分配原则)。