专业网站建设品牌策划,施工企业资质序列,wordpress add_option内容被转义,网站内如何@引言
作为开发人员#xff0c;我们经常会和数据库打交道。
当我们对数据库进行修改操作的时候#xff0c;例如添加字段#xff0c;更新记录等#xff0c;没有正确评估该表在这一时刻的使用频率#xff0c;直接进行修改#xff0c;致使修改操作长时间无法响应#xff0…引言
作为开发人员我们经常会和数据库打交道。
当我们对数据库进行修改操作的时候例如添加字段更新记录等没有正确评估该表在这一时刻的使用频率直接进行修改致使修改操作长时间无法响应造成锁表在 mysql 中如果出现 alter 操作引发Waiting for table metadata lock 类型的锁表会导致任何操作不可用后果是灾难性的。
程序设计不合理频繁对同一张表进行修改操作同样可能引发锁表。
数据库锁表问题一旦出现往往都是很致命的锁表时间过久可能会造成大量请求阻塞异常影响系统业务正常开展。本文将详细阐述数据库锁表原因解锁以及如何避免锁表。
锁表产生场景以及原因
场景
锁表通常发生在 DML insert 、update 、delete 语句中例如 程序A 对 A表 的 a数据 进行修改修改过程中产生错误没有commit也没有rollback这个时候 程序B 对 A表 的 a数据库进行修改会产生资源正忙的异常也就是锁表。
DDL也会引发锁表例如在 MySql 操作一张大表利用 alter 语句修改或新增字段的时候恰巧有一个长事务包括读在操作此表会触发修改等待造成锁表。
原因
当多个事务处理对多个资源同时访问时若双方已锁定一部分资源但也都需要对方已锁定的资源时无法在有限的时间内完全获得所需的资源就会处于无限的等待状态从而造成其对资源需求的死锁导致锁表。
如何解锁
锁表一旦产生需要我们尽快对其解锁释放资源不然会一直阻塞下面主要讲解 MySql 数据库的解锁方式。
MySql 解锁
执行sql
select * from information_schema.processlist where command not in (Sleep) ORDER BY time desc通过此 sql 可以查询到以下内容 sql已经按照阻塞时长从大到小排序找到耗时长的记录 id kill 即可
kill 16519789如何避免锁表
通常情况下数据库锁表大多是因为程序设计不合理导致的在写代码的时候我们要对业务场景充分考虑尽量做到以下两点
尽量减少程序中的 DMLinsertupdatedelete 操作所花费的时间对此类操作做好隔离控制防止阻塞。如果事务产生异常确保事务可以正常回滚。