PostgreSQL DROP TABLE 查询冻结

lou*_*vel 2 python postgresql wxpython psycopg2

我正在编写代码以在 Anaconda 的 Spyder 环境中用 Python 创建 GUI。在这段代码中,我使用了 PostgreSQL 数据库,因此我使用了 psycopg2 数据库适配器,以便我可以直接从 GUI 进行交互。

代码太长,无法在此处发布,因为它超过 3000 行,但总而言之,我与数据库交互没有问题,除非我尝试删除表。

当我这样做时,GUI 框架变得无响应,drop table查询不会删除预期的表,也不会抛出任何错误或任何其他类型的内容。

在我的代码中,所有导致表被删除的操作都通过函数 ( DeleteTable)进行处理。当我调用这个函数时,没有问题,因为我之前插入了几个打印语句,确认一切正常。当我用cur.execute(sql)代码行执行语句时会出现问题。

有人能弄清楚为什么我的桌子不会掉吗?

def DeleteTable(table_name):

    conn=psycopg2.connect("host='localhost' dbname='trial2' user='postgres'   password='postgres'")
    cur=conn.cursor()
    sql="""DROP TABLE """+table_name+""";"""
    cur.execute(sql)
    conn.commit()
Run Code Online (Sandbox Code Playgroud)

Lau*_*lbe 6

那一定是因为并发事务持有阻塞DROP TABLE语句的锁。

检查pg_stat_activity视图并注意几秒钟前state等于idle in transactionactive具有 的会话xact_start

这本质上是一个应用程序错误:您必须确保立即关闭所有事务,否则可能会发生坏事。

  • `SELECT * FROM pg_stat_activity WHERE state IN ('active', 'idle in transaction') AND pid <> pg_backend_pid();` - 确保事务关闭的唯一方法是关闭它们,抱歉。您可以设置“idle_in_transaction_session_timeout”作为针对有缺陷的应用程序的权宜之计。 (4认同)