Python3 - '超出锁定等待超时;尝试重新启动事务",并且仅在数据库上进行处理



使用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()

事实证明,另一个组件正在进行连接,但缺少commit()语句。

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

在python-mysql中设置readcommitted类似于

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/

最新更新