Транзакції

Вступ до 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...