На одной из презентаций о транзакциях Spring / Hibernate я высказал мнение, что ключевое слово synchronized
для метода и @Transactional
логически имеют много общего.Конечно, они совершенно разные звери, но все же они оба применяются в качестве аспектов к методу и оба контролируют доступ к некоторым ресурсам через некоторый общий монитор (например, запись в дБ).
Было несколько человекв толпе, которая сразу же выступила против и заявила, что мое сравнение смертельно неверно.Я не помню конкретных аргументов, но вижу здесь и кое-что.Например, synchronized
работает для всего метода с самого начала, и транзакция вступит в силу только при достижении оператора доступа к БД.Плюс synchronized
не предлагает никаких шаблонов блокировки чтения / записи.
Таким образом, вопрос в том, является ли мое сравнение совершенно неправильным, и я никогда не должен его использовать, или, при правильной формулировке, имеет ли смысл представлятьэто опытным инженерам, которые хорошо знают, как работает synchronized
, но все же пытаются узнать о транзакциях АОП?Какой должна быть эта формулировка?
Небольшое обновление.
Очевидно, мой вопрос звучал как сравнение транзакций БД с введением метода synchronized
в Java.Это не тот случай.Моя идея больше о сравнении сходств в семантике @Transactional
и synchronized
.
Одной из причин, по которой я это поднял, также была иллюстрация поведения распространения.Например, если @Transactional
равен PROPAGATION_REQUIRED, он будет иметь много общего с вводом блока synchronized
.Для транзакции: если транзакция присутствует, мы просто продолжаем ее использовать, а если нет, мы ее создадим.Для synchronized
, если у нас уже есть монитор, мы продолжаем его, а если нет, мы попытаемся получить его.Конечно, для @Transactional
мы не собираемся ограничивать границы метода.