2008-11-25 7 views
5

En un proyecto en el que estoy trabajando, hay una tabla con un activador "on update" que monitorea si una columna booleana ha cambiado (por ejemplo: false -> true = haz alguna acción). Pero esta acción solo se puede hacer una vez por una fila.Postgresql Concurrency

Habrá múltiples clientes accediendo a la base de datos, por lo que puedo suponer que, con el tiempo, varios clientes intentarán actualizar la misma columna de fila en paralelo.

¿El disparador de la "actualización" maneja la concurrencia en sí, o tengo que hacerlo en una transacción y bloquear manualmente la tabla?

+0

¿Observó una caída de rendimiento significativa cuando se activaron muchos activadores al mismo tiempo? – ady

Respuesta

17

Los activadores no manejan la concurrencia, y PostgreSQL debe hacer lo correcto independientemente de que utilice transacciones explícitas.

PostgreSQL usa bloqueo optimista lo que significa que la primera persona en actualizar realmente la fila obtiene un bloqueo en esa fila. Si una segunda persona intenta actualizar la fila, su declaración de actualización espera para ver si la primera confirma su cambio o retrocede.

Si la primera persona comete un error, la segunda persona recibe un error, en lugar de que se produzca su cambio y borre un cambio que podría haber sido interesante para ellos.

Si la primera persona retrocede, la actualización de la segunda persona se desbloquea y se procesa normalmente, porque ahora no va a sobrescribir nada.

La segunda persona también puede usar la opción NOWAIT, que hace que el error ocurra inmediatamente en lugar de bloquear, si su actualización entra en conflicto con un cambio no resuelto.

+1

+1 para el uso de la palabra "borrar". – swasheck