PDA

Ver la Versión Completa : Bloqueo de registros en DB2


mpedra
28-06-2003, 19:15:28
Salud Foro!!!

Recientemente he tenido que migrar us sistema de base de datos, desde un Oracle 9i a DB2 8.
Por la forma en como está hecho el código practicamente no he tenido que realizar cambios. PERO el problema se presentó con los bloqueos de registros.

En oracle tengo lo siguiente:

SELECT *FROM tabla WHERE condicion FOR UPDATE NO WAIT

En DB2 no es valido el NO WAIT, y en realidad no funciona el bloqueo. es decir, perece como que a pesar de la clausula FOR UPDATE el 2do usuario que intenta modificar el mismo registro puede acceder y modificarlo sin problemas, en lugar de quedarse esperando.
(Esto sucede como en el caso de la estrategia optimista de conflictos de edición, en la cual se supone que no habrá conflictos... pero yo necesito una estrategia pesimista, es decir que no me deje a cceder al registro si alguien mas lo está editando)

Bueno en resumen: ¿Alguien puede ayudarme con los bloqueos en DB2? Desde ya muchas gracias por la atención.


Saludos

Marcos

__cadetill
01-07-2003, 10:15:58
En principio, si el sistema esta bien configurado, es el propio As400 es que se dedica a controlar el tema de los bloqueos. Si un registro esta en modo edicion/insercion, otro usuario no puede acceder a el, pero si esta en modo lectura, cualquier usuario puede acceder a ese registro

mpedra
01-07-2003, 17:29:28
Te agradezco Cadetil, pero no estoy sobre AS/400 sino sobre Windows, es decir el DB2 server esta en él.
El tema de los bloqueos me ha dejado bastante confundido porque el manejo parece ser muy diferente al que hace Oracle.

La pregunta la deberia cambiar a:

Hay alguna/s sentencia/s SQL que me permitan bloquear un registro en DB2 utilizando BDE?

Como debo configurar el Transisolation del TDatabase, para que sean admitidos los bloqueos?

Bueno si tienen alguna idea o experiencia con este tema será bien recibida.

Saludos

Marcos

__cadetill
01-07-2003, 21:44:02
uff, pues mucho no voy a poder ayudarte, nunca he trabajado con DB" para Windows y esos menesteres siempre los he dejado a cargo del As400 :(

Espero que alguien pueda responderte

mpedra
01-07-2003, 22:01:44
Bueno gracias de todas formas, despues de leerme por lo menos 15 manuales de IBM donde no pude encontrar mas que un par de ejemplos y un monton de información dispersa y mal organizada, di con la solución:

La consigna es no poder editar un registro que está siendo editado por otro usuario.

Lo primero que hay que tener en cuenta que esta estrategia de acceso se configura para la base de datos a la que estemos accediendo. Es decir al menos hasta ahora....

==> Setear el parametro LOCKTIMEOUT a 0 (mediante el Control Central en la base de datos, Modificar parametros)
Se reinicia la base y ya estamos en condiciones.

==> Ahora para hacer el bloqueo del registro hay que tener en cuenta el nivel de aislamiento... prefiero no explicar esta parte porque a pesar de que lo he hecho funcionar no lo he entendido muy bien.

El SQL necesario para lograr el bloqueo es:

SELECT * FROM TABLA WHERE CONDICIONES
FOR UPDATE
WITH RR

donde RR es el nivel de aislamiento que le quiero dar al acceso.
Es interesante para entender que pasa con los diferentes nivles de aislamiento probar diferentes convinaciones entre el nivel de aislamiento de la base y del acceso, y que pasa con la obtención de registros que han sido modificados... y no 'comiteados'



Saludos

Marcos

__cadetill
01-07-2003, 22:10:48
Me alegra cantidad de que lo tengas solucionado. A ver si en la proxima podemos darte una ayudita :)