Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Bloqueo de Registro en un SP (https://www.clubdelphi.com/foros/showthread.php?t=2327)

raul_sal 18-07-2003 06:15:09

Bloqueo de Registro en un SP
 
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 ...

Código:

  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,

Cita:

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,

Cita:

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/c...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,

Cita:

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/c...ajarDelphi.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,

Cita:

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.


La franja horaria es GMT +2. Ahora son las 20:31:26.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi