事务

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 语句都是一个事务!

事务会影响某些函数

  • 在事务开始时确定并保持不变
    • SYSDATE, TIMESTAMP, CURRENT_DATE

有些函数绕过事务

  • 在每次语句执行时确定
    • GETDATE, TIMEOFDAY
Redshift 入门

事务结构

  • BEGIN;START TRANSACTION; 开始
  • 包含一条或多条以分号结尾的 SQL 语句
  • END;COMMIT; 结束
  • 注意:分号很重要
BEGIN;

query1; query2;
END;
Redshift 入门

获得一致的查询结果

-- 开启事务
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;
Redshift 入门

事务中的函数行为

-- 开启事务
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;
Redshift 入门

Passons à la pratique !

Redshift 入门

Preparing Video For Download...