FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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 |
#2
|
||||
|
||||
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.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#3
|
|||
|
|||
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. |
#4
|
|||
|
|||
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? |
#5
|
||||
|
||||
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 */ 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. |
#6
|
|||
|
|||
Gracias por contestar Kinobi,
Solo una consulta en donde muevo los parametros WAIT o NO WAIT |
#7
|
||||
|
||||
Hola,
Cita:
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. |
#8
|
|||
|
|||
Me conecto por medio de las IBX y en otros casos con BDE, como puedo hacer para controlar las transacciones.
Gracias |
#9
|
||||
|
||||
Hola,
Cita:
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. |
#10
|
||||
|
||||
Hola de nuevo,
Cita:
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. |
#11
|
||||
|
||||
En el caso específico del BDE, a través del componente TDatabase.
Digamos db1.StartTransaction; db1.Commit; db1.Rolloback; Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#12
|
||||
|
||||
Hola,
Cita:
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. |
|
|
|