mysql 修复“超过锁定等待超时;尝试使用单个查询重新启动事务

dl5txlt9  于 2023-01-16  发布在  Mysql
关注(0)|答案(1)|浏览(127)

我有多个用户在我的应用程序中查询多个数据库。当其中一个用户收到错误“超过锁定等待超时;尝试重新启动事务”我可以执行类似以下操作:

SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE `USER`='trial_505813';

那么

KILL 25685;

但我能不能这样做:

KILL (SELECT `ID` FROM INFORMATION_SCHEMA.PROCESSLIST WHERE `USER`='trial_505813')

通过一个查询终止指定用户的所有进程?

jtw3ybtb

jtw3ybtb1#

MariaDB有一个KILL USER <name>命令:https://mariadb.com/kb/en/kill/
MySQL没有实现这个特性,你必须为那个用户获取所有的进程id,然后写一个循环来逐个杀死它们。
Python中的示例:

import mysql.connector

cnx = mysql.connector.connect(user='root', password='xxxx', database='test')
cursor = cnx.cursor()

cursor.execute("SELECT id FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER = %s", ["trial_505813"])
result = cursor.fetchall()
for row in result:
    cursor.execute(f"KILL {row[0]}")

我不得不说,因为锁等待超时而杀死查询或线程似乎是一个苛刻的解决方案,您可能可以优化查询,使它们不会持有锁太长时间。
如果查询已经过优化,则可能会让事务保持未提交状态的时间过长。事务在完成之前一直保持锁定。因此,需要在查询完成后立即完成事务(COMMIT或ROLLBACK)。

相关问题