Перейти к содержанию

Транзакции

В Picodata поддерживаются транзакции — блоки команд. В рамках транзакции пользователь может выполнить несколько SQL-запросов атомарно — так, как если бы это был единый запрос. Для транзакционных запросов действуют ограничения.

Структура

Транзакционный блок представляет собой запрос вида DO $$ BEGIN ... END $$;, внутри которого можно поместить набор вложенных запросов. Такой блок функционально является неименованной процедурой.

Поддерживаемые команды исполнения

На данный момент для транзакционных блоков поддерживаются следующие команды исполнения:

  • QUERY — выполнить вложенный запрос (используется для DML-запросов)
  • RETURN QUERY— выполнить вложенный запрос и отобразить результат выполнения (используется для DQL-запросов)

Пример использования

DO $$ BEGIN
  RETURN QUERY SELECT item FROM warehouse WHERE id = 2;
  UPDATE warehouse SET item = 'grills' where id = 2;
END $$;

Ограничения

Поддержка транзакционного выполнения команд в Picodata имеет ограничения:

  • все запросы к шардированным таблицам внутри блока должны выполняться в рамках одного и того же бакета
  • поддерживаются только запросы, не требующие перемещения данных
  • для глобальных таблиц поддерживаются только читающие запросы (DQL), но не модифицирующие (DML)
  • читающие команды в блоке должны располагаться строго до модифицирующих: то есть, все RETURN QUERY SELECT ... должны идти до UPDATE и дальше уже появиться не могут