Python3 - '超过锁定等待超时;尝试重新启动事务'并且只在数据库上处理

Posted

技术标签:

【中文标题】Python3 - \'超过锁定等待超时;尝试重新启动事务\'并且只在数据库上处理【英文标题】:Python3 - 'Lock wait timeout exceeded; try restarting transaction' and only process on the databasePython3 - '超过锁定等待超时;尝试重新启动事务'并且只在数据库上处理 【发布时间】:2016-02-11 11:55:08 【问题描述】:

使用 Python,我总是得到一个

(1205, 'Lock wait timeout exceeded; try restarting transaction')

每当我尝试插入特定表时出错。但是,当我尝试直接从 mysql 控制台插入时,它工作得很好。深入了解

SHOW FULL PROCESSLIST

在数据库上没有显示其他活动查询。由于这是一个没有附加实时应用程序的开发数据库,​​我无法想象任何问题。但是,它在托管我们的生产数据库的服务器上提供服务,因此我强烈希望尽可能不进行重置。有关如何调试此问题的任何建议?

注意 如果我使用 SHOW FULL PROCESSLIST 查看对数据库运行的查询,最终会因上述消息而失败,然后从 MySQL 控制台手动插入它,它会按预期工作。

编辑 下面是一个查询示例:

INSERT INTO deals (user_ID, store_ID, storeChain_ID, title, dealSaving, 
dealDisclaimer, restriction, dealImage, dealURL, submit_ID, userProvider_ID, 
createDate, createDateTime, expirationDate, expirationDateTime, ZIP, STATE, 
city, businessType, DealType_ID, IP, rating, popular, dealSearchData, tag, 
submitName, provider_dealID)
VALUES (NULL,
        2651049,
        NULL,
        'Toronto East Community Arts Program',
        'Three-Week Photography Workshop',
        NULL,
        NULL,
        'https://a1.image.net/imgs/8423535b-bd3b-4e1e-afee-ab2869970a4c/700_q60.jpg',
        'https://www.exmples.com/deals/1336374',
        111,
        1,
        '2015-11-12',
        '2015-11-12 10:01:58.282826',
        '2015-11-17 09:59:59',
        '2015-11-17 23:59:00',
        'M4M 1K7',
        'ON',
        'Toronto',
        NULL,
        '1',
        '127.0.0.1',
        0,
        144565,
        'Three-Week Photography Workshop',
        'Photography Class',
        'Partner',
        1336374)

编辑 使用该建议的示例如下:

self.DB['master']['cursor'].execute("SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED")
self.DB['master']['con'].commit()
self.DB['master']['cursor'].execute(dealsquery,data)
self.DB['master']['con'].commit()

【问题讨论】:

你能显示你的python查询吗? 我添加了一个示例查询 你使用多线程吗? 不,它是单线程的。 【参考方案1】:

事实证明,一个不同的组件正在建立连接并丢失了 commit() 语句。

【讨论】:

【参考方案2】:

我相信 MySql 使用“可重复读取”隔离,它将为整个事务(也就是直到提交,我相信)持有一个锁。尝试使用不同的隔离设置,例如“Read Committed”

在 python mysql 中设置读取提交类似于

cur = conn.cursor() cur.execute("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")

edit:一个很好的隔离级别介绍资源 http://vladmihalcea.com/a-beginners-guide-to-database-locking-and-the-lost-update-phenomena/

【讨论】:

我尝试在我的实际插入语句之前添加它,但问题仍然存在。 您在插入之前提交了更改吗?另外,您是否在继续之前提交了插入? 是的,每个插入后面都有一个提交,我也尝试在插入之前提交语句。我在原始问题中添加了一个示例 看这里,或许能帮到你***.com/questions/5836623/… 我注意到我的代码中有错误,请尝试使用已提交而不是未提交

以上是关于Python3 - '超过锁定等待超时;尝试重新启动事务'并且只在数据库上处理的主要内容,如果未能解决你的问题,请参考以下文章

超过锁定等待超时;尝试重新启动交易[关闭]

保存/更新模型时,Django“超过锁定等待超时;尝试重新启动事务”

超过锁定等待超时;尝试重新启动事务 - 插入语句

超过锁定等待超时;尝试重新启动事务 MYSQL Python

MySQL 错误:超过锁定等待超时;尝试重新启动事务查询

超过锁定等待超时;从表中删除数据时尝试重新启动事务