Transakce

Introduction to Redshift

Jason Myers

Principal Engineer

Motivace pro použití transakcí

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;
Introduction to Redshift

Příklad seskupení příkazů

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';
Introduction to Redshift

Chybné výsledky tabulky

data_intake

name priority
idaho_monitoring_locations 1
idaho_samples 1
idaho_site_id 3
Introduction to Redshift

Výhody a aspekty transakcí

  • Konzistentní výsledky dat
  • Vyžadování úspěchu nebo selhání pro skupinu dotazů
  • Souběžné operace

Výchozí chování při spuštění

  • Každý příkaz SQL je transakcí!

Transakce ovlivňují některé funkce

  • Nastaveny na začátku transakce a nemění se
    • SYSDATE, TIMESTAMP, CURRENT_DATE

Některé funkce transakce obcházejí

  • Nastaveny při každém spuštění příkazu
    • GETDATE, TIMEOFDAY
Introduction to Redshift

Struktura transakce

  • Začíná příkazem BEGIN; nebo START TRANSACTION;
  • Obsahuje jeden nebo více příkazů SQL, každý ukončený středníkem
  • Končí příkazem END; nebo COMMIT;
  • POZNÁMKA: Středníky jsou důležité
BEGIN;

query1; query2;
END;
Introduction to Redshift

Konzistentní výsledky dotazů

-- 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;
Introduction to Redshift

Chování funkcí v transakcích

-- 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;
Introduction to Redshift

Pojďme si procvičit!

Introduction to Redshift

Preparing Video For Download...