Какие критерии должна иметь операция, чтобы называться транзакцией
Что проверяют
Знаете ли вы ACID не как аббревиатуру, а как набор гарантий с конкретной ценой. Следом почти всегда спрашивают про уровни изоляции, а на Java-собеседовании ещё и про @Transactional в Spring.
Как отвечать
Транзакция это группа операций, которую база выполняет как одно целое. Критерии называются ACID:
- атомарность: применяются все изменения или ни одного, при ошибке
rollback; - согласованность: база переходит из одного корректного состояния в другое. Часть правил держит сама база (
NOT NULL, внешние ключи,CHECK), часть приложение: правило «баланс не уходит в минус» база не знает, пока вы его не описали; - изолированность: параллельные транзакции не мешают друг другу. На практике это уровень:
READ UNCOMMITTED,READ COMMITTED,REPEATABLE READ,SERIALIZABLE, они отличаются допустимыми аномалиями (грязное и неповторяющееся чтение, фантомы, потерянное обновление). По умолчанию в PostgreSQL и OracleREAD COMMITTED, в MySQL InnoDBREPEATABLE READ; - долговечность: после
commitизменения переживают сбой благодаря журналу предзаписи, который сбрасывается на диск при фиксации.
Покажите, как это выглядит в Java. В JDBC: setAutoCommit(false), операции, commit(), при исключении rollback(). В Spring: @Transactional на методе сервиса. Детали, которые ждут: откат по умолчанию только на RuntimeException и Error, для проверяемых исключений нужен rollbackFor; распространение по умолчанию REQUIRED, метод присоединяется к уже открытой транзакции; изоляцию задают атрибутом isolation.
Где спотыкаются
Путают согласованность из ACID с согласованностью из CAP. В CAP речь о том, видят ли все узлы одни и те же данные, это другое понятие.
Считают изоляцию по умолчанию полной. На READ COMMITTED два параллельных «прочитал, прибавил, записал» теряют обновление, нужны SELECT ... FOR UPDATE, оптимистичная блокировка через @Version или более строгий уровень.
Вызывают @Transactional-метод из другого метода того же класса. Вызов идёт мимо прокси Spring, и настройки транзакции этого метода не применяются.