事务未完成提交,导致表被锁

背景

xxxx项目中,需要将旧表数据导入新表中,因表结构与字段名都不同,遂采取设置一个定时任务去搞。

  • 读取老数据
  • 拆分新表所需数据信息
  • 插入新表

在本地Debug启动调试,程序运行到插入新表时,直接「 强制 」关闭程序。

image-20180821101845900

然后 …

image-20180916144048883

除了「复制」,其他操作都直接卡死…

完了完了… 这下得收拾收拾工位准备去找财务结算了

额,不对!这好像是「Dev环境」,NICE !~~

原因

通过跳板机登录上对应mysql服务查看哪些线程正在运行show processlist

image-20180916144250243

发现有大量对xxx-xxx-xxx表的操作状态出现 Waiting for table metadata lock (额,当时忘了截图,就后面随便去截了一张,自己YY一下吧…哈哈哈哈…)。

information_schema.innodb_trx 表中查看当前未提交的事务

image-20180821094620960

字段含义:

  • trx_state: 事务状态,一般为RUNNING
  • trx_started: 事务执行的起始时间,若时间较长,则要分析该事务是否合理
  • trx_mysql_thread_id: MySQL的线程ID,用于kill
  • trx_query: 事务中的sql

kill 752 杀掉线程后,表恢复正常,能正常进行骚操作了。

原因:前面的骚操作「强制关闭」,导致事务一直没提交,mysql在进行DDL操作时,如果该表存在未提交的事务则会出现Waiting for table metadata lock,阻塞后续对该表的其他操作。

总结

  • 别瞎操作,要守「江湖道义」
  • show processlist - 线程允许情况
  • information_schema.innodb_trx - 当前未提交的事务

版权声明:本文为YangDongChuan1995原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>