一、问题描述
今天在pycharm断点调试代码时,同时在终端执行了一个update语句,该update语句被阻塞终端长时间没有反应。
示例如下:
python
def test():
id_ = data.get('id') # 假设id_为66
db.session.query(User).filter_by(id=id_).populate_existing().with_for_update().first()
print("testing")
在第4行代码(print("testing"))处打上断点,然后运行。当运行到第4行时,在终端执行update修改User表的id为66的数据,会发现被阻塞。
二、原因
对User查询时,加了行锁。事务提交后,行锁才会被释放。
二、解决方法
-
方法一
该示例中代码执行完,事务也就会提交,行锁自然会被释放,此时update语句就会执行完成,不阻塞。
-
方法二
查看正在执行的事务,找到阻塞的事务,kill掉。
PostgreSQL 中,可以从表 pg_stat_activity 中,查看正在执行的事务和查询。
Mysql中,可以从information_schema 库的 innodb_trx 表中,查看当前执行中的事务。