Транзакция представляет собой атомарную операцию в базе данных, которая должна быть выполнена полностью или не выполнена вообще. Рассмотрим принципы написания корректных транзакций в различных системах.
Содержание
Основные свойства транзакций (ACID)
Свойство | Описание |
Atomicity (Атомарность) | Все операции транзакции выполняются как единое целое |
Consistency (Согласованность) | Транзакция переводит базу из одного согласованного состояния в другое |
Isolation (Изолированность) | Параллельные транзакции не влияют друг на друга |
Durability (Долговечность) | Результаты завершенной транзакции сохраняются после сбоев |
Синтаксис транзакций в SQL
Базовый шаблон
- Начало транзакции: BEGIN TRANSACTION
- Выполнение операций: INSERT/UPDATE/DELETE
- Фиксация изменений: COMMIT
- Или откат: ROLLBACK
Пример транзакции
Код | Описание |
BEGIN TRANSACTION; | Начало транзакции |
UPDATE accounts SET balance = balance - 100 WHERE id = 1; | Списание со счета |
UPDATE accounts SET balance = balance + 100 WHERE id = 2; | Зачисление на счет |
COMMIT; | Фиксация изменений |
Уровни изоляции транзакций
- READ UNCOMMITTED: Чтение незафиксированных данных
- READ COMMITTED: Чтение только зафиксированных данных
- REPEATABLE READ: Гарантированное повторное чтение
- SERIALIZABLE: Полная изоляция
Обработка ошибок в транзакциях
Ситуация | Действие |
Ошибка выполнения | ROLLBACK и обработка исключения |
Нарушение ограничений | Откат и логирование |
Таймаут | Автоматический откат |
Практические рекомендации
- Делайте транзакции максимально короткими
- Избегайте пользовательского ввода внутри транзакции
- Используйте соответствующий уровень изоляции
- Обрабатывайте все возможные ошибки
- Тестируйте на конфликты параллельного доступа
Транзакции в NoSQL базах данных
- MongoDB: multi-document transactions (с версии 4.0)
- Redis: команды MULTI/EXEC/DISCARD
- Cassandra: lightweight transactions с USING TIMESTAMP
- Elasticsearch: отсутствие классических транзакций
Правильно написанные транзакции обеспечивают целостность данных и надежность работы приложения. Важно учитывать особенности конкретной СУБД и требования к производительности.