Урок 7. Транзакции и контроль параллельного доступа в PostgreSQL

Транзакции и контроль параллельного доступа в PostgreSQL PostgreSQL

Изучите основы транзакций в PostgreSQL, поймите ACID свойства, уровни изоляции и механизмы блокировок. Научитесь обеспечивать целостность данных в многопользовательской среде.

Понятие транзакции

Представьте, что вы переводите деньги с одного банковского счета на другой. Этот процесс состоит из двух операций: снятие денег с одного счета и зачисление на другой. Важно, чтобы эти операции выполнились либо обе, либо ни одна. Вот тут-то и приходят на помощь транзакции!

Транзакция — это набор операций с базой данных, которые должны быть выполнены как единое целое. Если хотя бы одна операция в транзакции не может быть выполнена, вся транзакция отменяется.

ACID свойства

Транзакции в PostgreSQL обладают ACID свойствами:

  • Атомарность (Atomicity): Все операции в транзакции выполняются полностью или не выполняются вообще.
  • Согласованность (Consistency): Транзакция переводит базу данных из одного согласованного состояния в другое.
  • Изолированность (Isolation): Результаты незавершенной транзакции скрыты от других транзакций.
  • Долговечность (Durability): После завершения транзакции изменения сохраняются, даже если произойдет сбой системы.

Пример транзакции в PostgreSQL:

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;

Если что-то пойдет не так между BEGIN и COMMIT, мы можем использовать ROLLBACK для отмены всех изменений.

Уровни изоляции транзакций

PostgreSQL поддерживает четыре уровня изоляции транзакций:

  1. READ UNCOMMITTED
  2. READ COMMITTED (по умолчанию в PostgreSQL)
  3. REPEATABLE READ
  4. SERIALIZABLE

Давайте рассмотрим их на примере:

-- Терминал 1
BEGIN;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT balance FROM accounts WHERE id = 1;
-- Предположим, баланс равен 1000

-- Терминал 2
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;

-- Терминал 1
SELECT balance FROM accounts WHERE id = 1;
-- Теперь баланс будет 900
COMMIT;

В этом примере мы видим, как работает уровень изоляции READ COMMITTED: транзакция видит изменения, сделанные другими завершенными транзакциями.

Блокировки и решение конфликтов

PostgreSQL использует механизм блокировок для обеспечения изоляции транзакций. Существует несколько типов блокировок:

  1. Разделяемая блокировка (Shared Lock)
  2. Исключительная блокировка (Exclusive Lock)

Пример использования явной блокировки:

BEGIN;
LOCK TABLE accounts IN SHARE MODE;
-- Выполнение операций чтения
COMMIT;

Для разрешения конфликтов PostgreSQL использует механизм MVCC (Multiversion Concurrency Control), который позволяет читателям не блокировать писателей и наоборот.

Обнаружение взаимоблокировок

PostgreSQL автоматически обнаруживает ситуации взаимоблокировки (deadlock) и разрешает их, отменяя одну из конфликтующих транзакций.

Пример потенциального взаимоблокирования:

-- Транзакция 1
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;

-- Транзакция 2
BEGIN;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;

-- Транзакция 1
UPDATE accounts SET balance = balance + 100 WHERE id = 2;

-- Транзакция 2
UPDATE accounts SET balance = balance - 100 WHERE id = 1;

В этом случае PostgreSQL обнаружит взаимоблокировку и отменит одну из транзакций.

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

Домашнее задание:

  1. Создайте таблицу «accounts» с полями id и balance.
  2. Напишите функцию на PL/pgSQL для перевода денег между счетами, используя транзакции.
  3. Попробуйте выполнить параллельные транзакции с разными уровнями изоляции и проанализируйте результаты.
  4. Создайте ситуацию взаимоблокировки и посмотрите, как PostgreSQL ее разрешит.

Удачи в изучении транзакций и контроля параллельного доступа в PostgreSQL!

Для изучения функций и триггеров, перейдите к уроку 8: Функции и триггеры в PostgreSQL.

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x