2012-03-10 16 views
12

Estoy usando Spring con JDBC y encontré que es autocommit.¿Cómo puedo configurar para desactivar el compromiso automático en Spring + JDBC?

¿Cómo puedo configurar para desactivarlo en spring-servlet.xml?

Esta es mi configuración actual:

<bean id="dataSource" 
    class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" 
    p:driverClassName="${jdbc.driverClassName}" 
    p:url="${jdbc.databaseurl}" p:username="${jdbc.username}" 
    p:password="${jdbc.password}" /> 

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 

Respuesta

14

Parece que mi configuración se perdió esta línea:

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

Luego, en mis clases de servicio, uso @Transactional anotación. Por ejemplo

@Service 
class CompanyServiceImpl implements CompanyService{ 
    @Autowired 
    private CompanyDAO companyDAO; 

    @Transactional 
    public void addCompany(Company company) { 
      companyDAO.addCompany(company); // in here, there is JDBC sql insert 
      companyDAO.addCompany_fail(company); // just for test 
    } 
} 

Si hay una excepción ocurre en el addCompany_fail(), la primera addCompany() uno también se rollback.

Seguí este documento para comprender la idea de cómo se controla la transacción en Spring. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html

Seguí este documento para comprender cómo codificar con JDBC en Spring. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/jdbc.html

También he leído esto (Gratis) http://www.infoq.com/news/2009/04/java-transaction-models-strategy. Es realmente bueno. Y siento lo mismo con el escritor que la mayoría de las personas no entienden (o les importa) las transacciones.

PS: Parece que muchas personas entienden mal que el uso de dicho marco de Hibernate/Spring es solo para evitar la complejidad de JDBC y el control de transacciones. Mucha gente piensa que "JDBC y Transaction son tan complejos, solo usa Hibernate y olvídate de esos dos". Muchos ejemplos en Internet sobre Spring + Hibernate o Spring + JDBC aparentemente no se preocupan por la transacción en absoluto. Siento que esta es una mala broma. La transacción es demasiado seria para dejar que algo lo maneje sin una verdadera comprensión.

Hibernate y Spring es tan poderoso y tan complejo. Entonces, como alguien dijo: "El gran poder viene con responsabilidades".

ACTUALIZACIÓN: 2013-08-17: Hay un buen ejemplo de transacción aquí http://www.byteslounge.com/tutorials/spring-transaction-propagation-tutorial. Sin embargo, esto no se explica que si desea utilizar REQUIRES_NEW, ¿por qué es necesario crear otra clase (de lo contrario obtendrá este problema Spring Transaction propagation REQUIRED, REQUIRES_NEW, que parece REQUIRES_NEW en realidad no se cree una nueva transacción)

Actualización: 2018 -01-01: He creado un ejemplo completo con Spring Boot 1.5.8.LANZAMIENTO aquí https://www.surasint.com/spring-boot-database-transaction-jdbi/ y algunos ejemplos de experimentos básicos aquí https://www.surasint.com/spring-boot-connection-transaction/

+0

Y esto funcionó porque el administrador de transacciones de Spring desconecta el auto-commit y hace sus propios commits? – Raedwald

2

No se puede, sólo tiene que ejecutar su código dentro de una transacción, Primavera desactivará automáticamente auto-entrega para usted. La forma más fácil (por lo menos a set-up) para ejecutar una pieza de código en una transacción en la primavera es utilizar TransactionTemplate:

TransactionTemplate template = new TransactionTemplate(txManager); 

template.execute(new TransactionCallback<Object>() { 
    public Object doInTransaction(TransactionStatus transactionStatus) { 
    //ALL YOUR CODE ARE BELONG TO... SINGLE TRANSACTION 
    } 
} 
+0

Gracias por la respuesta. Para respaldar una imagen más amplia, parece que Spring crea mucha más complejidad para jdbc simple. :) –

+0

@SurasinTancharoen: bueno, en realidad no. Dije que era más fácil * configurar *, pero no para usar. Con '@ Transactional' o AOP puede ejecutar varias líneas de código dentro de una sola transacción con cambios mínimos en el código. –

+0

Acabo de leer esto http://www.ibm.com/developerworks/java/library/j-ts2/index.html ¿Pueden ser "alternativas programáticas con Spring" una alternativa? –

Cuestiones relacionadas