事务未完成提交,导致表被锁
背景
在xxxx项目中,需要将旧表数据导入新表中,因表结构与字段名都不同,遂采取设置一个定时任务去搞。
- 读取老数据
- 拆分新表所需数据信息
- 插入新表
在本地Debug启动调试,程序运行到插入新表时,直接「 强制 」关闭程序。
然后 …
除了「复制」,其他操作都直接卡死…
完了完了… 这下得收拾收拾工位准备去找财务结算了
额,不对!这好像是「Dev环境」,NICE !~~
原因
通过跳板机登录上对应mysql服务查看哪些线程正在运行show processlist
发现有大量对xxx-xxx-xxx
表的操作状态出现 Waiting for table metadata lock
(额,当时忘了截图,就后面随便去截了一张,自己YY一下吧..哈哈哈哈…)。
从 information_schema.innodb_trx
表中查看当前未提交的事务
字段含义:
- 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
- 当前未提交的事务