Свойства транзакций (ACID)
Свойство | Описание |
Atomicity (Атомарность) | Все операции транзакции выполняются или не выполняются |
Consistency (Согласованность) | Транзакция переводит базу из одного согласованного состояния в другое |
Isolation (Изолированность) | Транзакции не мешают друг другу |
Durability (Долговечность) | Результаты завершенных транзакций сохраняются после сбоев |
- MySQL/MariaDB: START TRANSACTION или BEGIN
- PostgreSQL: BEGIN или START TRANSACTION
- Oracle: SET TRANSACTION или просто BEGIN
- SQL Server: BEGIN TRANSACTION
- START TRANSACTION;
- INSERT INTO accounts (user, balance) VALUES ('user1', 1000);
- UPDATE accounts SET balance = balance - 100 WHERE user = 'user2';
- COMMIT; -- или ROLLBACK при ошибке
Доступные уровни
Уровень | Описание |
READ UNCOMMITTED | Чтение незафиксированных данных |
READ COMMITTED | Чтение только зафиксированных данных |
REPEATABLE READ | Повторяемое чтение |
SERIALIZABLE | Сериализуемые транзакции |
- MySQL: SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
- PostgreSQL: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
- SQL Server: SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
Пример на Python (psycopg2 для PostgreSQL)
- Установить соединение с базой данных
- Создать объект cursor
- Выполнить BEGIN TRANSACTION
- Выполнить SQL-запросы
- Подтвердить (commit) или откатить (rollback) изменения
- Закрыть соединение
Ситуация | Действие |
Успешное выполнение | COMMIT |
Ошибка в одном из запросов | ROLLBACK |
Потеря соединения | Автоматический ROLLBACK |
Лучшие практики
- Делайте транзакции как можно короче
- Избегайте пользовательского ввода во время транзакции
- Используйте подходящий уровень изоляции
- Всегда обрабатывайте возможные ошибки
- Тестируйте работу с откатами
Правильное использование транзакций обеспечивает целостность данных и защищает от частичного выполнения операций при сбоях. Выбор конкретного подхода зависит от используемой СУБД и требований приложения.