2010-12-16 23 views
10

Considere que tengo un método de control get() que llama a unos pocos métodos de servicio que trabajan con la base de datos.Transaccional: controlador vs servicio

¿Es correcto hacer que todo el método de control sea transaccional o simplemente con cada método de servicio?

Me parece que debemos hacer que get() sea transaccional porque realiza operaciones asociadas.

Gracias!

Respuesta

5

Prefiero hacer solo transaccionales los métodos de servicio que deben ser transaccionales y controlar la transaccionalidad en el servicio que no está en el controlador. Puede crear un método de servicio que englobe otros métodos de servicio y con la transacción de primavera administrar la transacción con propagación en la anotación @Transactional.

@Transactional(propagation =...) 

Editar

Si tuviera 2 métodos, por ejemplo saveUser() y saveEmail() (porque puedo almacenar los mensajes de correo electrónico en una base de datos para enviarlos más tarde - como una cola) Me gustaría crear en mi servicio es un método saveUserAndSendEmail (Usuario usuario) que sería transaccional. Este método llamaría saveUser y saveEmail() a cada uno en un componente @Repository porque tratan con la base de datos. Así que les pondría en los componentes de @Repository los métodos para manejar con la base de datos y luego controlaré la transaccionalidad en el componente @Service. Entonces, el controlador solo tendrá que preocuparse de proporcionar los datos y llamar cuando sea necesario. Pero realizo una transacción porque no quiero comprometer cambios en la base de datos hasta que todo el método se haya ejecutado correctamente.

Pero este es el estilo que suelo usar, no estoy diciendo que este sea el camino a seguir.

+0

Parece ser el diseño preferido, pero ¿por qué? Considere que necesito cargarMenuItems(), loadUserInfo(), loadDocument() - muchos métodos. Según usted tengo que crear un método loadMenuItemsAndUserInfoAndDocument() - ¿está bien? –

+0

@Andrey No he dicho que sea el diseño preferido. Es la forma en que generalmente trabajo porque prefiero que el controlador no tenga que estar al tanto de la administración de transacciones. De acuerdo con el nombre de sus métodos, comenzando con la carga ... si solo son reales desde la base de datos, ¿por qué necesita hacer una transacción? – Javi

+1

Bueno, ¿qué pasa si tiene dos métodos: createUser(), sendEmail() de diferentes servicios (usuario y correo). Y debe llamarlos a ambos en un controlador transaccional. ¿Qué deberías hacer? –

7

Eso depende totalmente de usted y de cómo interprete su propia lógica comercial.

A Spring realmente no le importa dónde pones los límites de la transacción, y ciertamente no te limita a ponerlos en tus clases DAO.

Así que sí, agregar @Transactional a sus métodos de controlador es perfectamente válido.

+6

En mi humilde opinión, @Transactional en un controlador no tiene demasiado sentido desde una perspectiva arquitectónica (MVC). Quiero decir, un controlador no debería ser consciente de la capa de persistencia, y podría tener que reutilizar su lógica de negocios en una aplicación de escritorio donde su capa de controlador ya no existe ... Creo que la transaccionalidad debe definirse en la capa @Service. –

Cuestiones relacionadas