@Transactional
определяет демаркационную линию.Аннотирование класса эквивалентно аннотированию каждого открытого метода класса, линия разграничения по-прежнему является методом (в вашем случае, testNumberTransaction()
).Решение о фиксации / откате будет принято в точке разграничения, то есть при возврате из вашего метода тестирования.Независимо от того, указали ли вы REQUIRES
или REQUIRES_NEW
распространение, фактическая единица транзакции одна и та же, ваш метод testNumberTransaction()
, поэтому два вызова service.add(...)
всегда будут выполняться в одной и той же транзакции.
ЕслиВаша цель - всегда откатывать свои транзакции после теста, а затем просто удалить аннотацию @Transactional
(или поставить @nontransactional, как вы упомянули).
Если, с другой стороны, вы хотите FORCEновую транзакцию для каждого вызова service.add(...)
, вы можете создать оболочку для своего класса обслуживания, где у вас есть метод add(...)
, аннотированный @Transactional (распространением = Propagation.REQUIRES_NEW), и вызвать обернутый service
экземпляр add(...)
метод оттуда.ИЛИ вы можете добавить декларативное управление транзакциями в ваш весенний тестовый контекст, который добавляет уведомление о транзакции для вашего метода service.add(...)
.Более подробную информацию о том, как добавить поддержку декларативных транзакций с помощью тегов <tx:XXX>
, можно найти в весенней документации .