true transaction read only example error java spring transactions readonly

java - transaction - Primavera-Transacción Readonly



@transactional spring example (2)

A. ¿Tengo que decir get * como readonly? Todos mis métodos get * son puras operaciones DB de lectura. No deseo ejecutarlos en ningún contexto de transacción. ¿Qué tan grave es el error anterior?

En realidad, es probable que aún desee ejecutar todos sus get() en el contexto de una transacción, para asegurarse de que está obteniendo lecturas consistentes. Por otro lado, si no le importa esto, puede configurar el nivel de transacción en consecuencia.

C. ¿Por qué alguien querría tener métodos transaccionales donde readonly = true? ¿Hay algún significado práctico de esta configuración?

  1. Para ayudar a proteger contra escrituras errantes dentro de los métodos get () `
  2. Para fines de optimización. Hibernate no solo puede hacer uso de esta información, como lo mencionó Bozho, sino que algunas bases de datos / controladores JDBC también pueden hacer uso de esta información.

Solo quería sus opiniones de expertos sobre la gestión declarativa de transacciones para Spring. He aquí mi arreglo:

  1. La capa DAO es JDBC antiguo y simple utilizando Spring JdbcTemplate (sin hibernación, etc.)
  2. La capa de servicio es POJO con transacciones declarativas de la siguiente manera: save*, readonly = false, rollback for Throwable

Las cosas funcionan bien con la configuración anterior. Sin embargo, cuando digo get*, readonly = true , veo errores en mi archivo de registro que indican get*, readonly = true Database connection cannot be marked as readonly . Esto sucede para todos los métodos get * en la capa de servicio.

Ahora mis preguntas son:

A. ¿Tengo que configurar get* como readonly? Todos mis métodos get* son puras operaciones DB de lectura. No deseo ejecutarlos en ningún contexto de transacción. ¿Qué tan grave es el error anterior?

B. Cuando elimino la configuración de get* , no veo los errores. Además, todas mis simples operaciones get* se realizan sin transacciones. ¿Es este el camino a seguir?

C. ¿Por qué alguien querría tener métodos transaccionales donde readonly = true ? ¿Hay algún significado práctico de esta configuración?

¡Gracias! Como siempre, tus respuestas son muy apreciadas!


Esta publicación indica que el comportamiento o el indicador readOnly es dependiente del mecanismo de persistencia.

C. Sí, cuando se utiliza hibernación, proporciona beneficios de rendimiento al establecer el modo de descarga en FLUSH_NEVER (como se describe en la publicación vinculada)

B. Sí, las llamadas JDBC no requieren una transacción (hibernación requiere una), por lo que al eliminar la configuración @Transactional recorta toda la administración de transacciones.

A. Supongo que Spring está llamando a connection.setReadOnly(true) pero su controlador JDBC no admite esto

La conclusión es: no utilice transacciones de readonly con JDBC simple.

Y otra cosa: se supone que las transacciones abarcan múltiples consultas. No hagas tus transacciones demasiado finas. Hazlos una unidad de trabajo .