Hola,
Estoy empezando con esto de las transacciones, y ya me dado de bruces
con esto del deadlock.
He empezado a leer y mas o menos he entendido el problema , pero por
favor corregime si no lo he entendido bien.
Por lo que veo hay varios casos en los que podemos obtener un deadlock
de estos :
1.- que una transacción t1 necesite que termine la t2 y esta t2 a su vez
necesita que termine t1 para poder terminar, entonces el gestor detecta
esto y elimina la mas antigua (por ejemplo la t1) y devuelve el deadlock
en la t1, y la t2 termina correctamente.
2.- Empieza la transaccion t1(1) (varios insert en la tabla x), y
despues otro usuario lanza la misma transaccion t1(2), si la t1(1) tarda
mucho tiempo en terminar, el gestor devuelve el deadlock a la t1(1) y
asi la t1(2) se puede comenzar y terminar correctamente
¿correcto?, ¿voy bien hasta qui?.
Tengo un proceso de cierre de inventario que puede tardar 10 minutos en
terminar y no quiero que nadie pueda tocar la tabla , ni insertar, ni
modificar.
Había pensado que si pongo 'LOCK TABLE movimientos IN EXCLUSIVE MODE'
y no recibía ningún error, la tabla ya era de uso exclusivo de mi
proceso, que nadie podía molestar a mi proceso y que al resto de
procesos debían de esperar para iniciarse o les daría un error al
iniciar, pero mi sorpresa es que mi proceso recibe un deadlock y el
resto termina bien.
Si el cierre se ejecuta solo, termina perfectamente, pero en el momento
que algun usuario no se esta quieto , intenta introducir un movimiento
ya recibo el deadlock . Como es muy difícil que un usuario te haga caso
cuando le dices que no trabaje, había pensado que al bloquear la tabla
les daría error a ellos y no podrían hacer nada hasta que el cierre
terminara.
¿ que estoy haciendo mal ? , ¿como lo puedo hacer?
-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripci�n:
http://www.postgresql.org/mailpref/pgsql-es-ayuda