Quiero incrementar un campo en una tabla de base de datos en 1 usando Hibernate.Hibernar: Incrementar un campo entero
Puedo hacer esto simplemente cargando un objeto, incrementando el valor y actualizando el objeto. Sin embargo, si aparece otro hilo y actualiza el campo entre la carga y la actualización, el valor se dañará.
Así que en lugar que he llamado una actualización directamente en la base de datos:
Query updateHits = createQuery(
"UPDATE Job SET hitCount = hitCount + 1 WHERE id = :jobId");
updateHits.setInteger("jobId", job.getId());
updateHits.executeUpdate();
Sin embargo, mi opinión es que esto no pasa por el bloqueo optimista en la base de datos y actualmente estoy experimentando un problema con los puntos muertos en el servidor SQL y creo este es el culpable
¿Hay alguna forma de incrementar un campo sin llamar directamente a la actualización y manteniendo la integridad de los datos?
es posible que desee comprobar para ver cómo se crean los bloqueos. Si obtiene un bloqueo de tabla para esa actualización, algo anda mal. Si obtiene un bloqueo de fila, no veo cómo va a causar un punto muerto. – BlackICE
En realidad, he logrado resolver el problema del interbloqueo simplemente asegurándome de que esta actualización sea la última instrucción que se ejecute dentro de la transacción. Sin embargo, todavía estoy interesado en conocer mejores soluciones. – 3urdoch
su solución de "incremento por consulta" es diez veces mejor que lidiar con bloqueos pesimistas, especialmente si está trabajando en transacciones múltiples y de larga ejecución – kommradHomer