sql >> Base de Datos >  >> RDS >> Oracle

Contención de filas de Oracle que provoca errores de interbloqueo en una aplicación JMS de alto rendimiento

Un interbloqueo implica que cada subproceso intenta actualizar varias filas en una sola transacción y que esas actualizaciones se realizan en un orden diferente en los subprocesos. La respuesta más simple posible, por lo tanto, sería modificar el código para que los mensajes dentro de la misma transacción se apliquen en algún orden definido (es decir, en el orden de la clave principal). Eso aseguraría que nunca obtendría un interbloqueo aunque aún obtendría bloqueos de bloqueo mientras un subproceso espera a que otro subproceso confirme su transacción.

Sin embargo, dando un paso atrás, parece poco probable que realmente desee que muchos subprocesos actualicen la misma fila en una tabla cuando no puede predecir el orden de las actualizaciones. Parece muy probable que eso conduzca a muchas actualizaciones perdidas y a un comportamiento bastante impredecible. ¿Qué, exactamente, está haciendo su aplicación que haría que este tipo de cosas fueran sensatas? ¿Está haciendo algo como actualizar tablas agregadas después de insertar filas en una tabla de detalles (es decir, actualizar el recuento de la cantidad de vistas que tiene una publicación además de registrar información sobre una vista en particular)? Si es así, ¿esas operaciones realmente necesitan ser sincrónicas? ¿O podría actualizar el recuento de vistas periódicamente en otro hilo agregando las vistas durante los últimos N segundos?