PDA

Ver la Versión Completa : Bloqueo de Registro en un SP


raul_sal
18-07-2003, 06:15:09
Que tal amigos del foro tengo una consulta es posible iniciar manualmente una transaccion en un sp y destruirla al terminar la ejecucion del mismo, esto con el fin de bloquear los registros que actualizan los mismos.


Gracias

jachguate
18-07-2003, 07:59:41
No es recomendable, y de hecho creo que el motor no lo permite, iniciar y terminar una transacción en un Stored Procedure, sin embargo este siempre se ejecutará en el contexto de una transacción, por lo que los registros que modifica quedarán bloqueados hasta que se de un commit.

Iván
18-07-2003, 10:04:52
InterBase / FireBird no permiten crear una transacción dentro de un SP / Trigger.

Como te dice jachguate, al ejecutar un SP este ya estará dentro de una transacción, y hasta que no confirmes los cambios, nadie más verá las modificaciones sobre el registro.

Un saludo.

raul_sal
18-07-2003, 21:43:41
Bueno el problema que tengo en realidad es que dentro de un SP manejo la actualizacion de un campo X pero resulta que cuando 2 personas actualizan a la vez el registro este no se bloquea y resulta que uno de los dos actualiza la version anterior del mismo.


Que puedo hacer con esto?

kinobi
18-07-2003, 22:42:16
Hola,

utiliza una edición "en vacío" previa a la edición real, algo parecido a ...


UPDATE <tabla>
SET <clave> = <valor_actual_clave>
WHERE <clave> = <valor_actual_clave>
...
...
/* resto de procesos */
...
...
/* edición real */


con ésto consigues simular (en realidad es un bloqueo real) un bloqueo sobre el registro(s) en cuestión.

Si quieres que al resto de transacciones (usuarios) el servidor les devuelva un error si intentan editar también ese registro, utiliza el parámetro "NO WAIT" para la transacción; si quieres que la transacción espere a que se solucione el bloqueo (bien por un COMMIT o un ROLLBACK) utiliza el parámetro "WAIT".

Saludos.

raul_sal
19-07-2003, 09:14:35
Gracias por contestar Kinobi,

Solo una consulta en donde muevo los parametros WAIT o NO WAIT

kinobi
19-07-2003, 12:19:12
Hola,

Posteado originalmente por raul_sal
Solo una consulta en donde muevo los parametros WAIT o NO WAIT

eso depende del método que estés utilizando para conectarte a tu servidor. Si utilizas SQL embebido será de una manera, si utilizas componentes de acceso (tipo IBX, DBX, ...) en una aplicación Delphi, C++, ..., será de otra y si utilizas directamente el API será otra ... depende.

Por cierto, no estoy ahora mismo seguro al cien por cien, pero creo que el valor predeterminado es: NO WAIT.

¡Ah!, otra cosa, el "bloqueo" del que estamos hablando es un bloqueo de escritura, pero no de lectura.

Saludos.

raul_sal
19-07-2003, 19:16:30
Me conecto por medio de las IBX y en otros casos con BDE, como puedo hacer para controlar las transacciones.
Gracias

kinobi
19-07-2003, 19:49:26
Hola,

Posteado originalmente por raul_sal
como puedo hacer para controlar las transacciones.

En primer lugar conociéndolas. Para ello te recomiendo la lectura de un artículo que escribí hace tiempo sobre el tema; en mi página web podrás descargártelo en varios formatos ...

http://www.clubdelphi.com/users/kinobi/

Al final del documento hay una serie de referencias (algunas a páginas web) que también es interesante seguir.

Como además comentas que utilizas IBX, te recomiendo también la lectura de este trabajo que se centra más en el asunto de las transacciones InterBase desde IBX ...

http://webs.satlink.com/usuarios/c/cybermac/delphi/IBX.zip

no tengo a mano el nombre del autor, pero si alguien tiene la referencia le agradecería que la pusiese para darle su justo y merecido reconocimiento.

Saludos.

kinobi
19-07-2003, 20:03:05
Hola de nuevo,

Posteado originalmente por kinobi
no tengo a mano el nombre del autor, pero si alguien tiene la referencia le agradecería que la pusiese para darle su justo y merecido reconocimiento.

me autocito a mi mismo porque creo que he localizado el nombre del autor, y éste es: Ernesto Cullen.

Pues para Ernesto mi/nuestro agradecimiento.

Por cierto, aunque hace un par de años que parece que no actualiza su web, contiene otros artículos interesantes sobre bases de datos y Delphi. La dirección es ...

http://webs.satlink.com/usuarios/c/cybermac/bajarDelphi.htm

Saludos.

jachguate
21-07-2003, 00:45:29
En el caso específico del BDE, a través del componente TDatabase.

Digamos

db1.StartTransaction;
db1.Commit;
db1.Rolloback;

Hasta luego.

kinobi
21-07-2003, 15:11:23
Hola,

Posteado originalmente por jachguate
db1.StartTransaction;
db1.Commit;
db1.Rolloback;

me da la impresión que raul_sal preguntaba por la forma de modificar los parámetros de la transacción, tanto en IBX como en BDE.

Si es ése el caso, seguramente estos enlaces ayudarán (para BDE):

http://www.delphi32.com/info_facts/faq/faq_873.asp

http://www.mers.com/INTERBASE4096.HTML

Saludos.