Ver Mensaje Individual
  #2  
Antiguo 30-10-2008
Avatar de RolphyReyes
RolphyReyes RolphyReyes is offline
Miembro
 
Registrado: ago 2004
Ubicación: Santo Domingo
Posts: 285
Reputación: 22
RolphyReyes Va por buen camino
Smile

Saludos.

No especificas como haces los UPDATE o INSERT de las tablas en cuestión.

Pero una opción podría ser utilizar Stored Procedure y Trigger para agilizar estas operaciones.

Otra opción no muy recomendada (según tengo entendido) es usar la sentencia With Lock o For Update.

Extraído de Firebird V1.5 Release Notes:
Cita:
(1.5) Bloqueos explícitos
Nickolay Samofatov
La introducción de la cláusula opcional WITH LOCK proporciona una limitada capacidad de hacer bloqueos pesimistas explícitos para uso prudente en las condiciones en las que el conjunto de registros afectados es a) extremadamente pequeño (mejor si es uno solo) y b) exactamente controlado por el código del aplicativo.

NOTA La necesidad de un bloqueo pesimista en Firebird es muy rara de hecho y debe ser bien
entendido antes de plantearse utilizar esta extensión.
Sintaxis
SELECT ... FROM <algunatabla>
[WHERE ...]
[FOR UPDATE [OF ...]]
[WITH LOCK]
...;
Si la cláusula WITH LOCK se ejecuta bien, se realizará un bloqueo de los registros seleccionados y se
evitará que cualquier otra transacción obtenga acceso de escritura a dichos registros, o sus
dependientes, hasta que su transacción termine.
Si se incluye la cláusula FOR UPDATE, el bloqueo se aplicará a cada registro, uno por uno, guardándose
en la caché del servidor. Llega a ser posible, entonces, que un bloqueo que pareció funcionar cuando
fue solicitado sin embargo falle posteriormente, cuando se intenta enviar un registro que está
bloqueado por otra transacción.
Es esencial comprender los efectos del nivel de aislamiento de las transacciones y otros atributos de las
mismas antes de intentar incluir bloqueos explícitos en las aplicaciones.
La construcción SELECT... WITH LOCK está disponible en DSQL y PSQL. Sólo funciona en el nivel más
alto, con sentencias SELECT que afectan a una única tabla. No está disponible en subconsultas, ni para
joins. No se puede especificar con el operador DISTINCT, la cláusula GROUP BY o cualquier otra
operación de agregación de registros. No puede utilizarse con o en una vista, ni con tablas externas, ni
con los resultados de un procedimiento almacenado llamado desde un select.
Comprendiendo la cláusula WITH LOCK
Como el motor considera, por turnos, cada registro que cae bajo una sentencia de bloqueo explícita,
bien devuelve la versión del registro que ha sido confirmada lo más actualmente posible, sin importar
el estado de la base de datos cuando la sentencia fue enviada, o bien devuelve una excepción.
El comportamiento esperado y la notificación de conflictos depende de los parámetros especificados a la transacción (modo TPB).

Ejemplos
i) (simple)
SELECT * FROM DOCUMENT WHERE ID=? WITH LOCK
ii) (varios registros, procesados uno a uno por un cursor DSQL)
SELECT * FROM DOCUMENT WHERE PARENT_ID=? FOR UPDATE WITH LOCK
Hasta luego.
__________________
Gracias,
Rolphy Reyes
Responder Con Cita