sql 事物锁表问题

发布时间 2023-09-18 16:14:00作者: 尐少

Python 对 mysql 的函数支持有问题,执行包含sql函数的更新语句时可能会有问题的,导致锁表后无法操作。

如sql:

UPDATE user_info set create_time = DATE_SUB(NOW(), INTERVAL 1 DAY) where user_id = '123456';

 

sql执行没有问题,但是放到Python代码中执行,会超时异常,多执行几次会报锁表;

 

1、锁表后需要手动将卡了事物杀掉:

#查看当前线程
show full processlist;

#查看运行中的事物
SELECT * FROM information_schema.INNODB_TRX;

 

innodb_trx表的参数自行百度,找到执行代码时间创建的事物,结合线程表找到锁表的事物,执行:

kill 线程id

把锁死的线程杀掉即可;

 

2、代码中可以对变量进行加工后传入sql语句,不要用sql内置函数,如上述sql在代码中要写成:

import datetime


user_id = '123456'
T = datetime.datetime.now() - datetime.timedelta(days=1)
sql = 'UPDATE user_info set create_time = "{}" where user_id = "{}";'.format(T, user_id)