【发布时间】:2017-11-07 19:09:29
【问题描述】:
假设我正在开发一个 ETL,它会定期从 CSV 读取源数据并替换 Postgres (9.6) 中的表。
这是一种方法:
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查询将阻塞,直到事务完成。 - 在
COPY和CREATE INDEX完成之前,第二个事务不会阻塞SELECT查询。 - 两个事务都是原子的:在任何一种情况下,如果我发出
ROLLBACK而不是COMMIT,表将恢复所有原始数据和索引。
另外,除了索引的名称,还有其他功能上的区别吗?
【问题讨论】:
标签: sql postgresql transactions ddl