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

Транзакции

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

Структура

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

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

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

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

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

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

Ограничения

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

  • В рамках одной транзакции нельзя обращаться к более чем одному движку хранения
  • Все запросы к шардированным таблицам внутри блока должны затрагивать только один бакет. При нарушении этого условия Picodata вернет пользователю ошибку. В будущем появится поддержка команды EXPLAIN для транзакционных блоков, с помощью которой можно будет наглядно увидеть затронутые бакеты.
  • Поддерживаются только запросы, не требующие перемещения данных. Иными словами, в текущей реализации транзакции должны быть выполнимы в рамках одного узла Picodata. Глобальные транзакции, затрагивающие данные на нескольких узлах, не поддерживаются.
  • Для глобальных таблиц поддерживаются только читающие запросы (DQL), но не модифицирующие (DML).
  • На данный момент в транзакциях из DML поддерживается только UPDATE.
  • Читающие команды в блоке должны располагаться строго до модифицирующих: то есть, все RETURN QUERY SELECT ... должны идти до DML и дальше уже появиться не могут.