Транзакции

Введение в 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

Получение согласованных результатов запросов

-- 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...