sql >> Base de Datos >  >> RDS >> Mysql

StaleObjectStateException en actualizaciones de alta frecuencia

Parece que ha configurado Hibernate para usar control de concurrencia optimista . Eso significa que su tabla de Usuario tiene un campo de versión que Hibernate incrementa en cada actualización de fila.

Lo más probable es que su transacción comience al principio de la solicitud HTTP y finalice al final de la respuesta HTTP. Esto significa que el proceso de edición de un usuario consta de dos transacciones:una transacción para completar el formulario web y una transacción para guardar los cambios.

En ese caso, cambiar el nivel de aislamiento de la base de datos no servirá de nada. Lo más probable es que todo lo que obtenga sea peor rendimiento y escalabilidad .

No es malo tener StaleObjectException s. Refleja el mundo real:las personas realmente trabajan en lo mismo de vez en cuando y pueden surgir conflictos. La pregunta es, cuando se detecta un conflicto, ¿cómo se resuelve de una manera que satisfaga a los usuarios finales? ¿Se puede resolver sin la asistencia del usuario?

Las posibles estrategias podrían ser

  • sobrescribir los cambios del usuario anterior (a menudo no es lo que desea, de ahí la necesidad de control de concurrencia),

  • mostrar un mensaje de error pidiéndole al usuario que actualice y realice sus cambios nuevamente,

  • combinar automáticamente los cambios sin sobrescribir los cambios del usuario anterior (a veces es posible)

  • informar al usuario sobre la obsolescencia de sus datos y ofrecerle una forma de fusionar manualmente sus cambios

Todo depende del contexto.