Como tratar transação utilizando Spring

Sou iniciante em Spring e não sei como tratar transação com o mesmo.

Tenho um metódo doGravar, o mesmo irá ter que gravar em 3 tabelas diferentes e depois executar uma procedure.

Entrentato, se acontecer algum erro tudo deve ser desconsiderado, ou seja, gravou na tabela 1 e tabela 2 e na tabela 3 deu erro, o que foi
feito na 1 e 2 deve ser desconsiderado.

Da mesma forma para a execução da procedure, se gravar nas 3 tabelas e no momento de executar a procedure ocorrer um erro tudo deve ser desconsiderado.

Se alguém puder me ajudar ficarei muito agradecido.

Deus abençoe.

Bom, sendo iniciante não vai ter jeito, você vai ter que dar uma lida na documentação do spring.

A maneira que acho mais fácil é fazer a transação por meio da anotação @Transactional do spring.

Assim, você anota um método ou mesmo uma classe com essa anotação, e o spring já configura a transação para quando o método ou métodos da classe forem chamados.

Assim, ele já gerencia tudo pra você, e quando ocorrerem exceções ele já faz rollback por default (isso também pode ser customizado).

Outra opção é declarar no application-context.xml, as classes e métodos que você quer que sejam transacionais, é somente um outro método de configuração, caso não seja possível usar anotações.

Dos dois jeitos, o spring irá interceptar a chamada do método configurado para ser transacional, e criará uma transação por debaixo dos panos.

Vou passar um exemplo de configuracao usando anotações:

[code]<?xml version="1.0" encoding="UTF-8"?>

<context:property-placeholder location="classpath:application.properties" />

<context:component-scan base-package="com.meu.pacote" />

<tx:annotation-driven transaction-manager="txManager" />

<bean id="entityManagerFactory"
	class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
	<property name="persistenceUnitName" value="transportadora" />

	<!-- <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
		<property name="databasePlatform" value="${database.target}" /> <property 
		name="showSql" value="${database.showSql}" /> <property name="generateDdl" 
		value="${database.generateDdl}" /> </bean> </property> -->
	<!-- <property name="dataSource" ref="dataSource" /> -->
</bean>

<bean id="dataSource"
	class="org.springframework.jdbc.datasource.DriverManagerDataSource">
	<property name="driverClassName" value="${database.driver}" />
	<property name="url" value="${database.url}" />
	<property name="username" value="${database.username}" />
	<property name="password" value="${database.password}" />
</bean>

<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
	<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<bean
	class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

<bean
	class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

[/code]

O que mais interessa é as duas linhas:

[code]<context:component-scan base-package=“com.meu.pacote” />

<tx:annotation-driven transaction-manager="txManager" />[/code]

A primeira diz pro Spring escanear todas as suas classes começando do pacote que você indica no atributo (com.meu.pacote).

Assim, ele escaneia as anotações e configura quando encontrar qualquer anotação, @Repository, @Autowired, @Service, @Transactional, etc.

A segunda linha você diz que vai fazer a configuração de transações por meio de anotações.

Agora, você só tem que colocar tua classe service no pacote declarado, e fazer a anotação @Transactional no método, sem se preocupar em abrir, fechar, comitar e dar rollback nas suas transações, o spring faz isso automaticamente pra você.

A documentação do sprng explica o uso, como aqui por exemplo:
http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html#transaction-declarative-annotations