Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   bloquear tabla (https://www.clubdelphi.com/foros/showthread.php?t=53133)

look 11-02-2008 23:14:31

bloquear tabla
 
buenas compañeros del foro , tengo la la siguiete consulta :
utilizo delphi 7 y una base de datos sql server 2000 , lo que me gustaria saver es si hay alguna manera de bloquear una tabla mientras esta tabla esta en uso, demanera que espere aque si otro usuario trata de acceder a ella , esta transaccion espere a que la otra finalize para continuar con la otra ...:)

juanelo 11-02-2008 23:25:57

Que tal,
Lo que creo que debes de revisar es el ISOLATION_LEVEL con el que trabajas, por ejemplo si utilizas READ_COMMITED, entonces estas asegurando que los datos que leas de las base son lo últimos. En un entorno de base de datos como el del SQL Server,Oracle, FB, etc. no tiene mucho sentido el concepto de "bloquear", como se conocia en las bases de datos desktop.
Saludos

look 12-02-2008 00:08:21

estube viendo esto del los isolations level pere no se cual es el mas recomendable y si lo estoy utilizando bien:
Código Delphi [-]
Q_linfact.SQL.Text:='SET TRANSACTION ISOLATION LEVEL REPEATABLE READ  BEGIN TRANSACTION ;'+
' insert into FA0TY1 (num_reg,TIP_REG,TIP_DOC,CVE_DOC,CVE_ART,CANT,PXS,PREC,COST,IMPU1,IMPU2,DESC1,DESC2,DESC3,COMI,PAR_A  NT,PAR_SIG,PAR_ASIG,ACT_INV,NUM_ALM,TIP_CAM,REG_SERIE,REG_OBS,APAR,UNI_VENTA,TIPO_PROD,U4SEC,MONFLET  E,IMPU3,IMPU4'
+',IMP1APLA,IMP2APLA,IMP3APLA,IMP4APLA,TOTIMP1,TOTIMP2,TOTIMP3,TOTIMP4,TIPO_PRODT) '
+'values ('+inttostr(NREG+1)+','+inttostr(2)+','+QuotedStr('F')+','+QuotedStr(CVED)+','+QuotedStr(FORM2.Table  2.FieldBYNAME('CLAVE_ARTI').Text)
+','+inttostr(Table2.FieldBYNAME('CANT').Value)+','+inttostr(FORM2.Table2.FieldBYNAME('CANT').Value)  +','+floattostr((FORM2.Table2.FieldBYNAME('PRECIO').Value*form2.moneda.Fieldbyname('tcambio').Value)  )
+','+floattostr(costo)+','+inttostr(imp1)+',0,'+floattostr(table2.Fieldbyname('descr_desc').asfloat)  +',0,0,0,0,0,0,'+QuotedStr('A')+','+FORM2.shownalma.Text+','+floattostr(FORM2.moneda.FieldBYNAME('TC  AMBIO').Value)+',0,0,0'
+','+QuotedStr(tinve.FieldBYNAME('UNI_MED').Text)+','+QuotedStr('I')+','+QuotedStr(table2.FieldBYNAM  E('lote').asstring)+',0,0,'+floattostr(imp4)
+','+inttostr(imp1a)+',0,0,'+inttostr(imp4a)+','+floattostr(totimp1)+',0,0,'+floattostr(totimp4)+','  +QuotedStr('I')+' )'
+' COMMIT TRANSACTION';
Q_linfact.ExecSQL;
este es el codigo que utilizo para guardar en una tabla , lo unico que algunas veces parece que se pegara la transaccion y cuando otra maquina ejecuta la consulta se torna muy lento ... no se si la implementacion esta correcta , que me aconsejan...

kuan-yiu 12-02-2008 09:18:45

¿Y por qué no utilizas las transacciones?
Código Delphi [-]
  try
    database1.starttransaction;
    // Código con el Insert.
    database1.commit;
  except
    On E: Exception do
    begin
      ShowMessage('Error al insertar ' + chr(13) + E.Message);
      database1.rollback;
      exit;
    end;
  end;
Yo tengo muchos usuarios concurrentes haciendo procesos críticos (sacando números de factura) y jamás he tenido problemas con este método. Lo único es que intento que las transacciones sean lo más pequeñas que sea posible.

jcuzziol 08-08-2008 16:04:02

Hola, Proba con esta clausula en el select de la tabla que quieres bloquear
with (HOLDLOCK,XLOCK)
.


La franja horaria es GMT +2. Ahora son las 04:36:09.

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