数据库锁表?别慌,本文教你如何解决

参考:https://zhuanlan.zhihu.com/p/437702115

锁表产生场景以及原因

场景

锁表通常发生在 DML( insert 、update 、delete )语句中,例如:程序 A 对 A 表的 a 数据 进行修改,修改过程中产生错误,没有 commit 也没有 rollback ,这个时候程序 B 对 A 表的 a 数据进行修改,会产生资源正忙的异常,也就是锁表。

DDL也会引发锁表,例如在 MySql 操作一张大表,利用 alter 语句修改或新增字段的时候,恰巧有一个长事务(包括读)在操作此表,会触发修改等待,造成锁表。

原因

当多个事务处理对多个资源同时访问时,若双方已锁定一部分资源但也都需要对方已锁定的资源时,无法在有限的时间内完全获得所需的资源,就会处于无限的等待状态,从而造成其对资源需求的死锁,导致锁表。

如何解锁

锁表一旦产生,需要我们尽快对其解锁,释放资源,不然会一直阻塞,下面主要讲解 MySql 和 Oracle 数据库的解锁方式。

MySql 解锁

执行 sql:
select * from information_schema.processlist where command not in ('Sleep') ORDER BY time desc

通过此 sql 可以查询到以下内容:

sql 已经按照阻塞时长从大到小排序,找到耗时长的记录 id ,kill 即可:

kill 123

通过此命令也可以查询到 mysql 的慢 sql 语句,进行优化,info 字段即为具体执行的 sql 语句。

oracle 解锁(具体见参考链接原文,这里就不展开了)

如何避免锁表

通常情况下,数据库锁表大多是因为程序设计不合理导致的,在写代码的时候,我们要对业务场景充分考虑,尽量做到以下两点:

  1. 减少程序中 DML(insert,update,delete) 操作所花费的时间,对此类操作做好隔离控制,防止阻塞。
  2. 如果事务产生异常,确保事务可以正常回滚。
posted @ 2022-07-04 11:41  没有你哪有我  阅读(471)  评论(0编辑  收藏  举报