2012-09-28 11 views
15

Al usar JdbcTemplate, ¿necesito configurar explícitamente las transacciones?JdbcTemplate y transacciones de Spring

Mi diseño de código es el siguiente:

voy a tener una UserDao que se inyecta en la UserService, y luego mis controladores hará llamadas en métodos en mi UserService.

Quiero mantener las cosas lo más sencillas posible en lo que respecta a las transacciones, y no necesito varias llamadas a la base de datos para abarcar una transacción.

De forma predeterminada, ¿tengo que hacer algo en mi archivo de configuración o utilizar una anotación @Transaction en cualquier lugar?

Ahora diga en mi controlador que necesito hacer 2 llamadas en mi userService y accountService, ¿podría envolverlo explícitamente en una transacción de alguna manera?

userService.updateUser(user); 
accountService.updateXXX(...); 

Respuesta

21

Sí, JdbcTemplate no es un sustituto para la gestión de transacciones. Todavía se beneficia de las transacciones de bases de datos, por lo userService.updateUser operará en una transacciónbase de datos, pero si falla accountService.updateXXX, userService.updateUser se no reversión.

Si no desea utilizar AOP, puede usar TransactionTemplate en su lugar. Consulte programmatic transaction management en el Spring Reference Documentation.

Un patrón que he visto anteriormente es para la clase de controlador MVC para invocar un servicio comercial, que encapsula la operación. El método de la clase ejecutiva podría anotarse @Transactional.

+1

wow, ese es el código de una transacción, ¡@Transactional lo hace menos repetitivo para escribir! – loyalflow

+0

Lo es, pero es bastante útil si necesita acceder al 'TransactionStatus'. –

+1

+1 para la idea del servicio comercial. En mi humilde opinión, la vida sería más fácil si todos hicieran esto. – xdhmoore

9

Si su controlador desea hacer varias cosas con usuarios y cuentas y tener todo eso en una transacción, entonces debe tener un servicio con un método que haga todo eso. Crear un servicio por DAO no es una gran idea, ya que termina con envoltorios sin uso en torno a los DAO y el procesamiento será lento porque la base de datos tendrá que crear una transacción separada para cada llamada a un DAO, lo está haciendo mucho más trabajo de lo que debería.

El servicio debería proporcionar funcionalidad para el controlador o para quien lo llame. Intento crear servicios con la idea de que el servicio proporciona funciones específicas útiles para cierto tipo de usuario.

+1

+1 secundado. Esto facilita muchas cosas, incluidas las pruebas, y facilita la tarea de exponer cualquier funcionalidad a otra vista que no sea un controlador (una API REST, por ejemplo). – xdhmoore

Cuestiones relacionadas