Транзакции в серверном программировании

Статья основана на двадцатом видео из 31 темы курса SQL 2.0 — PL/pgSQL в PostgreSQL от Аристова Евгения, который является логическим продолжением курса SQL c 0. Ссылки на видео на платформах RUTUBE и VK video.

В данной статье подробно разбираются транзакция в серверном программировании и ключевые моменты управления.

В прошлой статье разбираются анонимная процедура, вызов этой процедуры, преимущества и ограничения.

Презентация и исходники доступны по ссылке.

Транзакции

Управлять транзакциями (begin, commit, rollback, savepoint) можно только в процедурах (в т.ч. анонимных).

Процедура как и функция выполняется в атомарной транзакции, но в процедуре возможно завершить текущую транзакцию (commit/rollback) и автоматически начнётся новая.

Также можно сохранить текущие изменения (savepoint), чтобы при определенных обстоятельствах можно было вернуться на эту сохраненную точку. Также можно обрабатывать ошибки и строить кастомную логику, основанную на цепочке транзакций.

Вложенных транзакций в PostgreSQL, к сожалению, нет.

Особенности реализации

Ключевые моменты управления транзакциями:

  • Используйте SAVEPOINT для гранулярного контроля
  • Обрабатывайте ошибки на разных уровнях
  • Минимизируйте время блокировок
  • Документируйте поведение транзакций в процедурах

Процедуры с транзакциями идеальны для:

  • Сложных бизнес-процессов
  • Операций, требующих атомарности
  • Систем с высокими требованиями к целостности данных
  • Распределенных операций

Пример кода:

-- Автоматическое управление транзакциями:
CREATE OR REPLACE PROCEDURE automatic_transaction_example()
AS $$
BEGIN
    -- Начало транзакции (неявно)
    INSERT INTO accounts (id, balance) VALUES (1, 1000);
    UPDATE accounts SET balance = balance - 100 WHERE id = 1;
    
    -- Если все успешно - COMMIT
    -- Если ошибка - ROLLBACK
END;
$$ LANGUAGE plpgsql;

Больше примеров доступно на гитхабе и в видео.

В следующей статье мы разберём транзакции в серверном программировании.


Опубликовано

в

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

3 × 2 =