Весенние транзакции с поддержкой распространения - PullRequest
9 голосов
/ 22 июня 2011

Я хотел бы понять, как использовать пружинную транзакцию с поддержкой распространения.В документации Java упоминается, что если метод, имеющий @Transactional(propagation = Propagation.SUPPORTS), вызывается из транзакции, он поддерживает транзакцию, но если транзакция не существует, метод выполняется без транзакций.

Разве это уже не поведение весенних транзакций независимо от Propagation.SUPPORTS?



public class ServiceBean {

    @Transactional(propagation = Propagation.SUPPORTS)
    public void methodWithSupportsTx() {
        //perform some database operations
    }
}

public class OtherServiceBean {

    @Transactional(propagation = Propagation.REQUIRED)
    public void methodWithRequiredTx() {
        //perform some database operations
        serviceBean.methodWithSupportsTx();
    }
}


В приведенном выше примере кода, независимо от того, имеет ли methodWithSupportsTx() аннотацию @Transactional(propagation = Propagation.SUPPORTS), она будет выполняться в транзакции в зависимости от того, имеет ли methodWithRequiredTx() аннотацию @Transactional, верно?

Так в чем же необходимость / использование наличия ПОДДЕРЖКИ уровня распространения?

Ответы [ 2 ]

4 голосов
/ 22 июня 2011

С Javadoc :

Примечание. Для менеджеров транзакций с синхронизацией транзакций PROPAGATION_SUPPORTS немного отличается от транзакции вообще, так как определяет область транзакции, для которой будет применяться синхронизация. Как следствие, одни и те же ресурсы (JDBC Connection, Hibernate Session и т. Д.) Будут совместно использоваться для всей указанной области. Обратите внимание, что это зависит от фактической конфигурации синхронизации диспетчера транзакций.

Таким образом, это означает, что, например, несколько вызовов Hibernate SessionFactory.getCurrentSession() внутри methodWithSupportsTx() будут возвращать один и тот же сеанс.

0 голосов
/ 22 июня 2011

Требуемая транзакция создаст новую транзакцию, если ее не существует.Поэтому новая транзакция будет выполнена при вызове serviceBean.methodWithSupportsTx ().Если ваш метод действительно транзакционный, вы увидите ошибку весны, если транзакции не существует.

...