为什么Drop Index需要提交?

时间:2013-11-21 14:38:07

标签: sql database postgresql postgresql-9.1 ddl

在我的多线程程序中,一个线程删除表上的索引(这首先发生),其他线程在同一个表中插入记录。碰巧在尝试删除索引时,表被锁定,插入事务变为“等待”

在对问题的非解决方案浪费了大量时间之后,我发现真正的解决方案是在删除索引后立即提交。发出提交时,表将被解锁并且插入事务成功完成。

我的问题是,为什么?我的印象是Drop Index是一个DDL语句,因此不需要提交。 Postgres似乎证明我错了。

2 个答案:

答案 0 :(得分:3)

在PostgreSQL中,所有DDL命令都是事务性的。因此,如果您启动事务块,或者您的驱动程序为您启动事务块,或者您的驱动程序未处于自动提交模式,则需要提交所有DDL命令,就像其他SQL命令一样。

其他SQL数据库以不同的方式执行此操作。

(挑剔:PostgreSQL中的一些DDL命令不能在事务块中运行,只能在事务中运行。所以你可以认为那些是上述“所有DDL命令”声明的例外。但这并不完全相同作为你的问题:这些命令仍然需要提交,它们不能与其他命令一起在事务中运行。)

答案 1 :(得分:2)

我不了解Postgres,但DDL语句并不总是自动提交。 例如,在Oracle中,它们是,但在DB2中它们不是(您可以执行创建表 + 索引然后回滚整个批次)。我认为SQL Server也需要提交(除非启用自动提交)。

基本上(取决于DB风格)DDL语句并不总是自动提交。