Транзакции должны удовлетворять свойствам ACID:
- Atomicity (Атомарность): Транзакция должна быть либо полностью выполнена, либо полностью отменена. Если какая-либо часть транзакции не удалась, вся транзакция откатывается к исходному состоянию.
- Consistency (Согласованность): Транзакция переводит базу данных из одного согласованного состояния в другое. Она не должна нарушать целостность данных или правила ограничений.
- Isolation (Изолированность): Выполняемые concurrently транзакции не должны влиять друг на друга. Результат выполнения множества транзакций должен быть таким же, как если бы они выполнялись последовательно. Проблемы изоляции включают:
- Dirty read (Грязное чтение): Чтение данных, которые еще не были зафиксированы (закоммичены) другой транзакцией.
- Non-repeatable read (Неповторяющееся чтение): Повторное чтение одних и тех же данных в рамках одной транзакции возвращает разные значения, потому что другая транзакция изменила и зафиксировала их между чтениями.
- Phantom read (Фантомное чтение): При повторном выполнении запроса с условием в рамках одной транзакции возвращается другой набор строк, потому что другая транзакция добавила или удалила строки, соответствующие условию.
- Durability (Надежность): После того как транзакция успешно завершена (зафиксирована), изменения, внесенные ею, должны быть постоянными и выдерживать сбои системы (например, отключение питания).
В Java для управления транзакциями часто используются фреймворки, такие как Spring Framework с его декларативным управлением транзакциями (@Transactional) или Java Transaction API (JTA).
Пример использования @Transactional:
java