FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Bloqueos de Registros
Hola a Todos:
Estoy trabajando en una aplicacion en Delphi 5 y con motor Firebird 1.5 release candidate 4. Tengo la aplicacion con el IBTransaction en Read-Commited, mi problema es que no me bloquea los registros.es decir,si el cliente 1 abre un registro y el cliente 2 abre el mismo registro, el cliente 2 lo puede borrar sin ningun problema y no da ningun tipo de bloqueo. En resumen lo k kiero es k si un cliente abre un registro, solamente este registro se bloquee para los demas usuarios y los demas no puedan realizar procesos sobre dicho registro. Desde ya muchas gracias por toda la ayuda k me puedan brindar ya k soy nuevo en esto .
__________________
Código PHP:
|
#2
|
||||
|
||||
Hola,
los bloqueos en InterBase y Firebird se gestionan de forma implícita por el servidor y sólo existen para el caso de los redactores a otros redactores ... hasta ahora. La versión 1.5 añade una nueva extensión a la sentencia SELECT de forma que un lector puede bloquear a otros redactores, aunque nunca a otros lectores. Te pego la descripción de la nueva característica tal cual, ya que no tengo instalado ahora mismo la versión 1.5 ... "... SELECT ... FROM <sometable> [WHERE ...] [FOR UPDATE [OF ...]] WITH LOCK; The WITH LOCK clause lets you lock the selected rows so that other users cannot lock or update the rows until you end your transaction. You can specify this clause only in a top-level SELECT statement (not in subqueries). This clause can be used in DSQL and PSQL. ..." Saludos. |
#3
|
||||
|
||||
Lo que pasa es que interbase tiene una visión super optimista de los bloqueos.... y estos solamente ocurren dentro de una transacción cuando un registro es modificado.
Otros usuarios podran seguir incluso haciendo selects sobre los registros borrados dentro de una transacción siempre que esta no haya recibido la sentencia commit. Si queres que media vez un usuario lee un registro este no sea modificado/eliminado por otro usuario (una vision pesimista) entonces, podes utilizar el truco de hacer un update "inutil" sobre el registro para que este sea bloqueado. Esto lo podes conseguir haciendo un update sobre la tabla. Código:
Update tabla set campo = campo where llave = LaLlave;
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#4
|
||||
|
||||
Hola,
Cita:
Saludos. |
#5
|
|||
|
|||
Gracias Amigos por responderme pero aun no entiendo mucho lo del update "inutil" (soy nuevo en esto de firebird),pero estoy trabajando con la release candidate 4 de firebird 1.5 asi es k voy a ocupar las sentencias entregadas por el maestro Kinobi....ahora vere como va todo. muchas gracias por la ayuda.
__________________
Código PHP:
|
#6
|
|||
|
|||
Hola Amigos:
Intente con el codigo k me facilito Kinobi......mi codigo dentro del Select es este: ____________________________ select * from CLIENTE where CODCLI=:C Order By CODCLI For Update With Lock ____________________________ al consultar por un registro del cliente en la aplicacion me sale esl siguiente error.... 'DINAMIC SQL ERROR SQL ERROR CODE=-502 ATTEMP TO REOPEN AN OPEN CURSOR' No entiendo que pasa....ayudemenme por favor. Obs:Me gustaria intentar con el Update "inutil",pero no se como hacerlo. desde ya muchas gracias
__________________
Código PHP:
|
#7
|
||||
|
||||
Hola,
Cita:
Código:
UPDATE <tabla> SET <un_campo_cualquiera> = <valor_campo> /* 1 */ WHERE <clave> = <valor_clave> /* 2 */ /* 1 */ <valor_campo> es el valor que tiene en ese momento <un_campo_cualquiera> /* 2 */ <valor_clave> es el valor de la clave del registro que quieres "bloquear" Respecto a asunto de SELECT ... WITH LOCK no puedo ayudarte. Ahora no tengo instalado Firebird 1.5 Saludos. |
#8
|
|||
|
|||
Hola a todos de nuevo...
He tratado por multiples formas pero no me resulta la edicion vacia... Expondre lo k he hecho para k me diga k hice mal: Tengo un DataSet llamado IBDCliente: Propiedades: SelectSql: select * from CLIENTE where CODCLI=:C Order By CODCLI InsertSql: insert into CLIENTE (CODCLI, RUTCLI, DVCLI, RAZSOCCLI, GIROCLI,DIRECCIONCLI, CIUDADCLI, FONOCLI, FAXCLI, FECHAREGCLI, CREDASIGCLI, CREDOCUPCLI, CREDDISPCLI, ENCARGADOCLI, TIPOCLI,ESTBLOQCLI, EMAILCLI, DIASCREDCLI, FULTVTACLI, CODLPCLI, COMUNACLI) values (:CODCLI,:RUTCLI,:DVCLI,:RAZSOCCLI,:GIROCLI,:DIRECCIONCLI, :CIUDADCLI,:FONOCLI,:FAXCLI,:FECHAREGCLI, :CREDASIGCLI,:CREDOCUPCLI,:CREDDISPCLI,:ENCARGADOCLI, :TIPOCLI,:ESTBLOQCLI,:EMAILCLI,:DIASCREDCLI,:FULTVTACLI,:CODLPCLI, :COMUNACLI) DeleteSql delete from CLIENTE where CODCLI=:OLD_CODCLI ModifySql update CLIENTE set RUTCLI=:RUTCLI, DVCLI=:DVCLI, RAZSOCCLI=:RAZSOCCLI, GIROCLI=:GIROCLI, DIRECCIONCLI=:DIRECCIONCLI, CIUDADCLI=:CIUDADCLI, FONOCLI=:FONOCLI, FAXCLI=:FAXCLI, FECHAREGCLI=:FECHAREGCLI, CREDASIGCLI=:CREDASIGCLI, CREDOCUPCLI=:CREDOCUPCLI, CREDDISPCLI=:CREDDISPCLI, ENCARGADOCLI=:ENCARGADOCLI, TIPOCLI=:TIPOCLI, ESTBLOQCLI=:ESTBLOQCLI, EMAILCLI=:EMAILCLI, DIASCREDCLI=:DIASCREDCLI, FULTVTACLI=:FULTVTACLI, CODLPCLI=:CODLPCLI, COMUNACLI=:COMUNACLI where CODCLI=:OLD_CODCLI despues de seleccionar el registro hice esto en el Dataset: IBDCliente.Close; IBDCliente.ModifySQL.Clear; IBDCliente.ModifySQL.Add('Update Cliente'); IBDCliente.ModifySQL.Add('Set RazSocCli=:RazSocCli'); IBDCliente.ModifySQL.Add('Where CodCli=:C'); IBDCliente.Params.ByName('C').AsInteger:=strtointCODCLI.Text); IBDCliente.Open; Claramente esta malo....pero k? o en k me ekivoke? puchas amigos ayudeneme por favor porque estoy en una nube negra....gracias
__________________
Código PHP:
|
#9
|
||||
|
||||
Hola,
Cita:
Nada más abrir el DataSet IBDCliente y situado sobre el registro que quieres "bloquear" (no hace falta que modifiques la propiedad ModifySQL), haz la edición vacía (llamada al método Edit + Post). Una vez que has hecho lo anterior, y sin cerrar la transacción ni el DataSet, el registro quedará "bloqueado" para el resto de transacciones hasta que cierres (commit o rollback) la que tienes asociada al DataSet IBDCliente. La duda que tengo es si comprendes que es lo que hace realmente la "edición vacía", ya que si no lo comprendes podemos estar dando vueltas al asunto días y días para que te funcione. Saludos. |
#10
|
|||
|
|||
Hola a Todos:
Cita:
__________________
Código PHP:
|
#11
|
|||
|
|||
Por favor ayudame Tauhr
Tengo el mismo problema que vos con el tema de bloqueo de registros.
No se donde hacer el update "inutil". Te agradecería enormemente si me explicas un poco como lo solucionaste y si tenés ganas mostrarme un ejemplo. Desde ya te estaría muy agradecida. Saludos y gracias. Anita |
|
|
|