transaction transaccional example ejemplo driven annotation spring dao transactional

spring - transaccional - Dónde debe colocarse "@Transactional" Service Layer o DAO



spring transaction propagation (5)

En primer lugar, es posible que esté preguntando algo que se haya preguntado y respondido antes, pero no pude recuperar el resultado de la búsqueda. De acuerdo, en general (o siempre hasta el momento :)) Definimos las anotaciones transaccionales en la capa de servicio.

Controlador-> Administrador-> Dao-> Orm.

Ahora tengo una situación en la que tengo que elegir entre el modelo de dominio basado en el sitio del cliente. Supongamos que el cliente A está usando mi modelo de dominio, todo está bien, pero luego otro sitio de cliente me daría un servicio web y no usaría nuestro modelo de dominio.

¿Qué capa debería reemplazar? Creo que tiene que ser Dao, que me proporcionará datos del servicio web y lo enviará de vuelta. Es decir, dos capas Dao escritas por separado y conectadas según el escenario.

Ahora me he dado cuenta de que hemos estado haciendo un acoplamiento cerrado (si hay algo así o no tiene acoplamiento flojo) cuando colocamos @Transactional en la capa de Servicio. Tantos cerebros no pueden estar equivocados o lo son (lo dudo).

Entonces, la pregunta es: "¿Dónde debería" @Transactional "colocar Service Layer o DAO?" y es la capa de servicio hacia abajo que debería reemplazar.


Debe usar @Transactional en la capa de servicio, si desea cambiar el modelo de dominio para el cliente B en el que debe proporcionar los mismos datos en un modelo diferente, puede cambiar el modelo de dominio sin afectar la capa DAO proporcionando un servicio diferente o creando una interfaz e implementando la interfaz en diferentes modelos y con el mismo servicio, rellene el modelo basado en el cliente. Esta decisión se basa en los requisitos del negocio y el alcance del proyecto.


Es una elección personal basada en tipos de aplicaciones, si la aplicación está en capas en muchos módulos y la mayoría de las operaciones están basadas en @CRUD, entonces tener la anotación transaccional en el nivel de servicio hace más sentido ... aplicación tipo motor como programadores, servidores de trabajo, @ etl las aplicaciones de informes, donde las sesiones y el concepto de usuario no existen, entonces la transacción de propagación a nivel de contexto es la más adecuada ... no deberíamos terminar creando transacciones clúster poniendo @transactional en todas partes terminando con patrones anti transaccionales ... de todos modos para una transacción pragmática controlar JTA2 es la respuesta más adecuada ... de nuevo depende del clima, puedes usarlo en una situación dada ...


Idealmente, la capa de servicio (Manager) representa su lógica de negocio y, por lo tanto, debe anotarse con @Transactional.

La capa de servicio puede llamar a diferentes DAO para realizar operaciones de DB. Supongamos situaciones en las que tiene 3 operaciones DAO en un método de servicio. Si su primera operación DAO falló, otros dos pueden aún pasar y usted terminará en un estado incoherente de DB. La capa de servicio de anotación puede salvarlo de tales situaciones.


Querrá que sus servicios sean transaccionales. Si sus DAO son transaccionales y llama a diferentes DAO en cada servicio, entonces tendría múltiples tx, que no es lo que desea. Realice las llamadas de servicio transaccionales, y todas las llamadas DAO dentro de esos métodos participarán en el tx para el método.


Sugeriré poner @Transactional en los métodos de la capa de servicio ya que podemos tener múltiples implementaciones DAO. al usar esto podemos hacer que nuestros servicios sean transaccionales. refer

la mejor práctica es utilizar un BasicService genérico para ofrecer servicios comunes.

El Servicio es el mejor lugar para poner @Transactional, la capa de servicio debe contener el comportamiento de caso de uso de nivel de detalle para una interacción del usuario que lógicamente se incluiría en una transacción. de esta forma, podemos mantener la separación entre el código de la aplicación web y la lógica comercial.

Hay muchas aplicaciones CRUD que no tienen una lógica de negocios significativa, ya que no es útil tener una capa de servicio que simplemente transfiera material entre los controladores y los objetos de acceso a datos. En estos casos, podemos poner una anotación de transacción en Dao.

Entonces en la práctica puedes ponerlos en cualquier lugar, depende de ti.

Al tener múltiples llamadas en su servicio, necesita @Transactional en servicio. las diferentes llamadas al servicio se ejecutarán en diferentes transacciones si pone @Transactional en servicio.