2013-02-28 3 views
0

У меня есть метод, который запускает транзакцию программно с использованием шаблона транзакции из Spring.Весенние транзакции по рекурсивным вызовам

Void methodA() { 
    TransactionTmeplate.......... 

    Setpropgation to requires new.... 

    /// do my stuff in trasaction 


} 

Поэтому, если у меня есть другой класс, который вызывает этот метод, он создает транзакцию, как и следовало ожидать. Но что произойдет, если этот метод будет введен снова из одного и того же вызывающего потока. Создается ли другая транзакция?

Пример:

MethodCaller -> methodA (transaction created) -> methodD -> methodA(??) 

Следуя:

Кроме того, если класс @autowired, будет две темы, требующие либо одну и ту же операцию, учитывая один экземпляр существует?

Я бы предположил, что у них нет собственной записи в стеке для метода.

+0

Какая логика выполнит что-то подобное? Предполагается, что транзакция представляет собой единую логику. Я бы сказал, что у этого есть запах кода – thatidiotguy

+0

да, я согласен ... но я пытаюсь следовать некоторому коду, и поведение ... похоже на это ... и так как я пишу его снова ... Я хочу быть уверенным в транзакциях и как они работают ... что возможно, чего нет ... – user1555190

ответ

0

Javadoc на Propagation.REQUIRES_NEW довольно ясный, я не уверен, было ли это лучше объяснено.

Что касается различных потоков, вызывающих ваш метод: TransactionManager будет следить за тем, чтобы потоки не чередовали друг с другом относительно транзакций.

Но если у вас есть метод, который является повторным и всегда запускает новую транзакцию, это означает, что ваше приложение неправильно наложено. Попробуйте сделать некоторые рефакторинг и убедитесь, что метод, отвечающий за запуск новой транзакции, никогда не называется рекурсивно.

+0

yeap я согласен .... спасибо ... :) – user1555190

Смежные вопросы