【发布时间】:2025-12-21 15:20:13
【问题描述】:
在我的多线程程序中,一个线程删除表上的索引(首先发生这种情况),其他线程在同一个表中插入记录。碰巧当尝试删除索引时,表被锁定并且插入事务变为“等待”。
在没有解决问题的问题上浪费了大量时间后,我发现真正的解决方案是在删除索引后立即commit。当发出 commit 时,表被解锁并且插入事务成功完成。
我的问题是,为什么?我的印象是 Drop Index 是一个 DDL 语句,因此不需要提交。 Postgres 似乎证明我错了。
【问题讨论】:
-
如果您需要在删除索引后发出 COMMIT,那么您用于连接数据库的任何工具都会打开事务。你在使用 JDBC 吗?我相信自动提交模式有一个切换。
DROP INDEX需要取出一个足够长的独占锁来执行命令,并确定没有其他事务正在使用该索引(否则您可能会得到不一致或不正确的结果)。 -
你说得对,是因为打开了一笔交易。不得不承诺。
标签: sql database postgresql postgresql-9.1 ddl