2
假設我正在研究定期從CSV讀取源數據並替換Postgres(9.6)中的表的ETL。Postgres事務中的DROP TABLE行爲
這裏有一個辦法:
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
查詢將阻塞,直到交易完成。 - 第二筆交易將不會阻止
SELECT
查詢,直到COPY
和CREATE INDEX
完成。 - 交易都是原子:在任何情況下,如果我發出了一個
ROLLBACK
,而不是COMMIT
,該表將與所有的原始數據和索引恢復。
此外,除了索引的名稱之外,是否還有其他功能差異?