2013-09-12 2 views
5

Я немного запутался в управлении ресурсами транзакций весной. А именно, я смущен насчет использования TransactionSynchronizationManager.isActualTransactionActive и TransactionSynchronizationManager.isSynchronizationActive.Весенние транзакции TransactionSynchronizationManager: isActualTransactionActive vs isSynchronizationActive

До сих пор, возможно, неправильно, я предположил, что isSynchronizationActive был использован (также в пределах Spring codebase), чтобы выяснить, есть ли активная транзакция, инициированная TransactionSynchronizationManager.initSynchronization(). Насколько мне известно, когда мы приостанавливаем транзакцию, фактический isSynchronizationActive по-прежнему верен! Поэтому я полагаю, что правильный способ установления текущей транзакции - использовать isActualTransactionActive, правильно?

Если это так, какова фактическая точка метода isSynchronizationActive? Я понимаю, что это говорит вам, можно ли добавить синхронизации или нет, но я немного потерял о том, что он говорит нам о сделке ...

ответ

4

Вы заметите следующие поля TransactionSynchronizationManager

private static final ThreadLocal<Set<TransactionSynchronization>> synchronizations = 
     new NamedThreadLocal<Set<TransactionSynchronization>>("Transaction synchronizations"); 

private static final ThreadLocal<Boolean> actualTransactionActive = 
     new NamedThreadLocal<Boolean>("Actual transaction active"); 

и методы

public static boolean isSynchronizationActive() { 
    return (synchronizations.get() != null); 
} 

public static boolean isActualTransactionActive() { 
    return (actualTransactionActive.get() != null); 
} 

TransactionSynchronizationManager в основном выступает в качестве реестра TransactionSynchronization. Javadoc заявляет

Если синхронизация транзакций не является активной, то либо нет текущей транзакции, или менеджер транзакций не поддерживает синхронизацию транзакций.

Таким образом, вы первый INIT и зарегистрировать TransactionSynchronization с initSynchronization() и registerSynchronization(TransactionSynchronization). Когда они зарегистрированы, TransactionManager может начать Transaction и сообщить TransactionSynchronizationManager, если он активен или нет с setActualTransactionActive(boolean).

В заключение isSynchronizationActive() сообщает, что если TransactionSynchronization был включен, даже если не зарегистрированы TransactionSynchronization экземпляров.

isActualTransactionActive() сообщает, что активен активный объект Transaction.

В TransactionSynchronizationManager Javadoc состояния

Центральный помощник, который управляет ресурсами и транзакционные синхронизаций на поток. Используется кодом управления ресурсами , но не типичным кодом .

поэтому не игнорируйте его.

+0

Спасибо, я получил выше. У меня есть следующий вопрос: когда вы пытаетесь выполнить вложенную транзакцию в распространении NOT_SUPPORTED, глобальная транзакция приостанавливается, но синхронизация для не транзакционного метода активна. Более того, если я выполняю этот не транзакционный код, например, TransactionTemplate, тогда шаблон транзакции фактически вызовет 'commit' в Менеджере транзакций, в свою очередь, выполнив все синхронизации. Это кажется немного странным для меня, поскольку что-то, что выполняется без транзакций, должно просто быть ...non-transactional – Bober02

+0

@ Bober02 Можете ли вы привести пример (в редактировании) вашего метода '@ Transactioanl' NOT_SUPPORTED? У меня есть идея, но не уверен. –

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