Estoy experimentando con el uso del patrón de comando para permitir que mi capa web funcione con entidades Hibernate dentro del contexto de una sola transacción (evitando así las excepciones de carga lenta). Sin embargo, estoy confundido ahora con la forma en que debo lidiar con las transacciones.Spring @Transactional solo lectura propagación
Mis comandos llaman a los métodos de capa de servicio anotados con anotaciones @Transactional
. Algunos de estos métodos de capa de servicio son de solo lectura, p. @Transactional(readOnly=true)
- y algunos son de lectura/escritura.
Mi capa de servicio expone un controlador de comandos que ejecuta los comandos pasados a él en nombre de la capa web.
@Transactional
public Command handle(Command cmd) throws CommandException
Asumo que tengo razón en la toma del controlador de comandos handle()
método transaccional. Aquí es donde entra la confusión. Si la implementación de un comando realiza llamadas a múltiples métodos de capa de servicio, el manejador de comandos no tiene forma de saber si las operaciones llamadas dentro del comando serán de solo lectura, lectura/escritura o una combinación de los dos.
No entiendo cómo funciona la propagación en este ejemplo. Si tuviera que hacer el método handle()
readOnly=true
, ¿qué ocurre si el comando llama entonces a un método de capa de servicio anotado con @Transactional(realOnly=false)
?
lo agradecería una mejor comprensión de esto y sus comentarios ...
Andrew
Entonces, ¿cuál de las dos respuestas contradictorias es cierto? ¿Alguien se ha molestado en verificar? – LuGo
Dado que 'handle()' _may_ call métodos que escriben, la transacción debe permitir escrituras. Eso estaría bien y correcto como una solución. Si realmente quisiera, podría investigar el inicio programático de TX y cambiar solo a read_ly, quizás a través de un atributo de Command, pero dudo seriamente que valga la pena el esfuerzo. –