@Transactional no Spring, métodos e/ou classes?

Olá,

Estou dando uma refatorada nas transações no meu sistema e gostaria da opnião de todos.

Estou usando Spring / HibernateTransactionManager.

Tenho no XML os métodos que necessitam de transação:

...

	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

	<bean id="transactionDef" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
		<property name="transactionManager" ref="transactionManager" />
		<property name="transactionAttributes">
			<props>
				<prop key="update*">PROPAGATION_REQUIRED , ISOLATION_READ_COMMITTED</prop>
				<prop key="*">PROPAGATION_REQUIRED , readOnly</prop>
			</props>
		</property>
	</bean>

...

Porém, gostaria de saber sobre a anotação @Transactional. Vi que você pode definir em sua classe(todos os métodos terão transação) ou método, porém o que mais devo fazer para configurar?

Alguém recomenda definir as transações via AOP?

Valeu!

Na verdade ,você está criando o proxy para suas classes na mão.

Você precisa substituir seu código por algo assim :

<tx:annotation-driven transaction-manager=“transactionManager”/>

coloca isso acima do transactionManager e seu código abaixo pode apagar o transactionDef se for usar as transações por annotation.

O Isolamento entre outras características, poderão ser controladas na própria annotation.

Para cada classe anotada, o Spring irá criar o proxy automaticamente.

Você ainda pode usar a annotation com o AspecJ para contextos fora do Spring, mas aí vc dá uma olhada no capítulo 9 da documentação :slight_smile:

Funcionou perfeitamente, só não to entendendo uma coisa:

Defini na minha classe de acesso a banco a anotação @Transactional(readOnly=true)

Porém, tenho um método de negócio muito complexo que exige alguns updates no banco, daí utilizei @Transactional(propagation = Propagation.REQUIRES_NEW).

O problema é que ele não utiliza a transaão do método como a principal e, além da transação que crio no método, ele continua criando pequenas transações pros métodos do meu DAO.

Ele não deveria assumir a transação de maior escopo, neste caso, ignorando a anotação da minha classe?