假设我正在处理一个定期从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
查询将被阻塞直到事务完成。 - 第二个事务将在
COPY
和CREATE INDEX
完成后才会阻塞SELECT
查询。 - 两个事务都是原子性的:无论何种情况,如果我使用
ROLLBACK
而不是COMMIT
,表格将恢复为所有原始数据和索引。
另外,除了索引名称之外,还有其他功能上的区别吗?