交易

Redshift 入門

Jason Myers

Principal Engineer

為何使用交易

SELECT name,
       priority,
  FROM data_log
       -- SYSDATE = 2024-02-07 00:17:24.259227
 WHERE intake_ts < SYSDATE;

SELECT name,
       data_size,
  FROM data_details
       -- SYSDATE = 2024-02-07 00:18:04.830527
 WHERE current_intake_date < SYSDATE;
Redshift 入門

語句分組範例

data_intake

name priority
idaho_monitoring_locations 1
idaho_samples 2
idaho_site_id 3
UPDATE data_intake 
   SET priority=1 
 WHERE name='idaho_samples';

UPDATE data_intake 
   SET priority=2 
 WHERE name='idaho_monitoring_locations';
Redshift 入門

發生錯誤的資料表結果

data_intake

name priority
idaho_monitoring_locations 1
idaho_samples 1
idaho_site_id 3
Redshift 入門

交易的優點與注意事項

  • 一致的資料結果
  • 一組查詢需同成同敗
  • 併發操作

預設執行行為

  • 每個 SQL 陳述都是一個交易!

交易會影響某些函式

  • 在交易開始時決定並維持不變
    • SYSDATETIMESTAMPCURRENT_DATE

部分函式可繞過交易

  • 於每次語句執行時決定
    • GETDATETIMEOFDAY
Redshift 入門

交易結構

  • BEGIN;START TRANSACTION; 開始
  • 內含一個或多個以分號結尾的 SQL 陳述
  • END;COMMIT; 結束
  • 注意:分號很重要
BEGIN;

query1; query2;
END;
Redshift 入門

取得一致的查詢結果

-- Start a transaction
BEGIN;
SELECT name,
       priority,
  FROM data_log
       -- SYSDATE = 2024-02-07 00:17:24.259227
 WHERE intake_ts < SYSDATE;

SELECT name,
       data_size,
  FROM data_details
       -- SYSDATE = 2024-02-07 00:17:24.259227
 WHERE current_intake_date < SYSDATE;
-- End a transaction
END;
Redshift 入門

交易中的函式行為

-- Start a transaction
BEGIN;
SELECT name,
       priority,
  FROM data_intake
       -- GETDATE = 2024-02-07 00:17:24.259227
 WHERE data_intake_ts < GETDATE();

 SELECT name,
       data_size,
  FROM data_details
       -- GETDATE = 2024-02-07 00:18:44.830527
 WHERE current_intake_date < GETDATE();
-- End a transaction
END;
Redshift 入門

一起來練習吧!

Redshift 入門

Preparing Video For Download...