Postgres事务中的DROP TABLE行为

17

假设我正在处理一个定期从CSV文件中读取源数据并替换Postgres(9.6)表的ETL任务。

以下是一种方法:

BEGIN
DROP TABLE IF EXISTS table
CREATE TABLE table (...)
COPY table FROM STDIN (FORMAT csv, HEADER true)
CREATE INDEX ON table (...)
COMMIT

这里还有一个例子:

BEGIN
CREATE TABLE table_temp (...)
COPY table_temp FROM STDIN (FORMAT csv, HEADER true)
CREATE INDEX ON table_temp (...)
DROP TABLE IF EXISTS table
ALTER TABLE table_temp RENAME TO table
COMMIT

以下内容是否正确?

  • 第一个事务将在DROP命令时锁定表,因此并发的SELECT查询将被阻塞直到事务完成。
  • 第二个事务将在COPYCREATE INDEX完成后才会阻塞SELECT查询。
  • 两个事务都是原子性的:无论何种情况,如果我使用ROLLBACK而不是COMMIT,表格将恢复为所有原始数据和索引。

另外,除了索引名称之外,还有其他功能上的区别吗?

2个回答

13

是的,您的三个假设都是正确的。

在两种事务情况下,最终结果是相同的,但第一种事务造成的阻塞时间会更长,取决于数据量和创建索引所需的时间。第二个事务只需要短暂锁定以重命名对象。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接