gpt4 book ai didi

django - Django LiveServerTestCase、Selenium 和 Postgres 的间歇性死锁

转载 作者:行者123 更新时间:2023-11-29 13:02:56 27 4
gpt4 key购买 nike

在使用 LiveServerTestCase 和 Selenium 测试 Django/Postgres 应用程序时,我遇到了间歇性死锁问题。 LiveServerTestCase 继承自 TransactionTestCase,因此每次测试运行后所有数据库表都会被截断。但有时这种截断会导致死锁,因为其中一个表被 Unresolved Postgres 事务锁定。我可以看到,因为此查询返回一行:

select * from pg_stat_activity 
where datname='test' and current_query='<IDLE> in transaction';

所以我的应用程序中的某些事件必须创建一个 Unresolved 事务。我梳理了测试以确保它们在退出之前等待所有更新完成,我确信不是这样。

查看 Postgres 日志我经常看到这两行,没有相应的 COMMITROLLBACK:

SHOW default_transaction_isolation
BEGIN

我怀疑是这些导致了僵局。知道什么可能发出此 SQL 或如何禁用它吗?这是 Django 1.5。

最佳答案

这个死锁的根本原因是 Django 1.5 的自动提交行为。默认情况下,Django 1.5 使用打开的事务运行,如果您执行 UPDATEINSERT,则该事务仅由 COMMIT 关闭。 “读取”操作 (SELECT) 导致我上面提到的不匹配的 BEGIN 语句。如果 SELECT 恰好在测试结束 TRUNCATE 之前发生,似乎会发生死锁。为避免死锁,测试必须仅在所有请求完成后退出,即使这些请求没有导致数据库写入。如果 Ajax 调用在更新后异步更新部分页面,这可能会很棘手。

更好的解决方案是使用 Django 1.6,其中 atomic() 是唯一(未弃用)的事务创建原语。它不会为读取操作打开事务,也不会留下悬空的 BEGIN 语句。测试可以遵循常识性方法,即在“写入”请求挂起时不退出。

关于django - Django LiveServerTestCase、Selenium 和 Postgres 的间歇性死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23833653/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com