Jump to content
Fivewin Brasil

Rlock, Flock, Shared, Exclusive... quando utilizá-los ?


edmandc

Recommended Posts

A pedido de um cliente vou começar a preparar meu aplicativo para ser utilizado na rede por mais de um usuário ao mesmo tempo.

Já implementei um algorítimo para que os usuários possam ter níveis administrativos ou níveis usuários
baseado em consulta a um dbf exclusivo para isto.

Estou com algumas dúvidas de quando devo travar só o registro e quando devo travar o banco de dados.

- Devo travar o registro ("Rlock()") apenas nas edições e exclusões de um único registro ?.

- Nas inclusões isto não seria necessário ?

- Travo os dbf ("Flock()" ) nos ajustes globais do banco ?.  (tipo: PACK REINDEX E ZAP)

- Um registro travado por outro usuário é passível de "sómente consulta" por outro usuário ?  (read only).

        ... se sim: o usuário que estará  consultando um registro que está sendo editado por outro usuário ...
                          poderá ver informações que poderão não mais representar o estado atual?

Grato por qq informação!

Link to comment
Share on other sites

Em 07/11/2021 at 15:19, edmandc disse:

A pedido de um cliente vou começar a preparar meu aplicativo para ser utilizado na rede por mais de um usuário ao mesmo tempo.

Já implementei um algorítimo para que os usuários possam ter níveis administrativos ou níveis usuários
baseado em consulta a um dbf exclusivo para isto.

Estou com algumas dúvidas de quando devo travar só o registro e quando devo travar o banco de dados.

- Devo travar o registro ("Rlock()") apenas nas edições e exclusões de um único registro ?.

- Nas inclusões isto não seria necessário ?

- Travo os dbf ("Flock()" ) nos ajustes globais do banco ?.  (tipo: PACK REINDEX E ZAP)

- Um registro travado por outro usuário é passível de "sómente consulta" por outro usuário ?  (read only).

        ... se sim: o usuário que estará  consultando um registro que está sendo editado por outro usuário ...
                          poderá ver informações que poderão não mais representar o estado atual?

Grato por qq informação!

Amigo, por mais respeito, satisfação e agradecimentos ao DBF, o qual ainda tenho alguns sistemas que utilizam por falta de tempo e capacidade pra migrar todos para o SQ, que no meu caso uso o POSTGRES, como vc está iniciando um novo sistema, sugiro (Não é nome de japonés tá) vc optar um um modo SQL, vc não vai se arrepender, mesmo que não utilize as instruções, vc pode utilizar a SQLRDD ou outra e continuar trabalhando como se fosse DBF. É só uma dica.

 

[]s,

 

 

Link to comment
Share on other sites

boa tarde, segue como eu faço com os antigos DBF :

* As funcoes que uso:

FUNCTION OpenFile( cFile, cAlias, nModo, lRetenta )

   DEFAULT cAlias TO Subs( cFile, rAt( '\', cFile )+1), nModo TO 2
   DEFAULT lRetenta TO nModo > 1

   Do While .T.
      DO CASE; Case nModo == 1
         USE (cFile) ALIAS (cAlias) NEW EXCLUSIVE 
      Case nModo == 2
         USE (cFile) ALIAS (cAlias) NEW SHARED
      Other
         USE (cFile) ALIAS (cAlias) NEW SHARED READONLY
      End

      If neterr()
         If lRetenta .AND. MsgRetryCancel( 'Arquivo ' + cFile + ;
                        ' sendo usado em outra estacao!', 'Alerta')
            loop
          else
            retu .f.
          endif
      Endif
      exit
   Enddo
return .T.






***** rede ***********
FUNCTION REGLOCK(P1)
   local Local1
   if p1=NIL
      p1:= 5
   endif

   do while (.T.)
      for Local1:= 1 to p1
         if (RLock())
            return .T.
         endif
         InKey(0.5)
      next
      if !msgyesno("Registro Bloqueado! Tenta novamente ?")
         return .F.
      endif
   enddo

RETURN( .F. )





function adireg(tempo)
  local loca1
  do while (.T.)
     for Local1:= 1 to tempo
         append blank
         if (!neterr())
            return .T.
         endif
         InKey(0.5)
      next
      if !msgyesno("Arquivo Bloqueado! Tenta novamente ?")
         return .F.
      endif
   enddo

return .T.

* Exemplos:

para abrir os arquivos:

  if OpenFile( ".\dados\orca","or", 1, .F. )
     select or
     or->(dbgotop()) 
  endif


* para travar o registro para alterar ou excluir:

     if reglock(10)   
        replace confbds->contro with "OK"
        replace confbds->contro1 with "OK1"
        dbunlock()
     endif

* para incluir novo registro:

  if adireg(10)
     replace numterm with "01"
     replace conf->t1 with 12
     replace conf->t2 with 18
     dbunlock()
  endif 

 

Link to comment
Share on other sites

// \samples\OPENFIL.PRG
	FUNCTION OpenFile( cFile, cAlias, nModo, lRetenta )
	   DEFAULT cAlias TO Subs( cFile, RAt( '\', cFile ) + 1 ), nModo TO 2
   DEFAULT lRetenta TO nModo > 1
	   WHILE( .T. )
	      SYSREFRESH()
	      DO CASE
      CASE nModo == 1
	         USE ( cFile ) ALIAS ( cAlias ) NEW EXCLUSIVE
	      CASE nModo == 2
	         USE ( cFile ) ALIAS ( cAlias ) NEW SHARED
	      OTHERWISE
	         USE ( cFile ) ALIAS ( cAlias ) NEW SHARED READONLY
	      ENDCASE
	      IF NetErr()
	         IF lRetenta .AND. MsgRetryCancel( 'Arquivo ' + cFile + ;
            ' sendo usado em outra estacao!', 'Alerta' )
	            LOOP
	         ELSE
	            RETURN( .F. )
	         ENDIF
	      ENDIF
	      EXIT
	   ENDDO
	RETURN( .T. )
// **** rede *********
FUNCTION REGLOCK( P1 )
	   LOCAL Local1
	   IF p1 = NIL
	      p1 := 5
	   ENDIF
	   WHILE( .T. )
	      SYSREFRESH()
	      FOR Local1 := 1 TO p1
	         IF ( RLock() )
	            RETURN( .T. )
	         ENDIF
	         // Inkey( 0.5 ) //Modo console.
	         SysWait( 0.5 ) // FiveWin
	      NEXT
	      IF .NOT. MsgYesNo( "Registro Bloqueado! Tenta novamente ?" )
	         RETURN( .F. )
	      ENDIF
	   ENDDO
	RETURN( .F. )
	FUNCTION Adireg( Tempo )
	   LOCAL loca1
	   WHILE( .T. )
	      SYSREFRESH()
	      FOR Local1 := 1 TO tempo
	         APPEND BLANK
	         IF( .NOT. NetErr() )
	            RETURN .T.
	         ENDIF
	         SysWait( 0.5 )
	      NEXT
	      IF .NOT. MsgYesNo( "Arquivo Bloqueado! Tenta novamente ?" )
	         RETURN( .F. )
	      ENDIF
	   ENDDO
	RETURN( .T. )
	// Exemplos:
	PARA abrir os arquivos:
	IF OpenFile( ".\dados\orca", "or", 1, .F. )
	   SELECT or
	   or->( dbGoTop() )
	ENDIF
	// para travar o registro para alterar ou excluir:
	IF reglock( 10 )
	   REPLACE confbds->contro WITH "OK"
   REPLACE confbds->contro1 WITH "OK1"
   dbUnlock()
	ENDIF
	// para incluir novo registro:
	IF adireg( 10 )
	   REPLACE numterm WITH "01"
   REPLACE conf->t1 WITH 12
   REPLACE conf->t2 WITH 18
   dbUnlock()
ENDIF

Abs

Link to comment
Share on other sites

2 horas atrás, william disse:

boa tarde, segue como eu faço com os antigos DBF :


* As funcoes que uso:

FUNCTION OpenFile( cFile, cAlias, nModo, lRetenta )

   DEFAULT cAlias TO Subs( cFile, rAt( '\', cFile )+1), nModo TO 2
   DEFAULT lRetenta TO nModo > 1

   Do While .T.
      DO CASE; Case nModo == 1
         USE (cFile) ALIAS (cAlias) NEW EXCLUSIVE 
      Case nModo == 2
         USE (cFile) ALIAS (cAlias) NEW SHARED
      Other
         USE (cFile) ALIAS (cAlias) NEW SHARED READONLY
      End

      If neterr()
         If lRetenta .AND. MsgRetryCancel( 'Arquivo ' + cFile + ;
                        ' sendo usado em outra estacao!', 'Alerta')
            loop
          else
            retu .f.
          endif
      Endif
      exit
   Enddo
return .T.






***** rede ***********
FUNCTION REGLOCK(P1)
   local Local1
   if p1=NIL
      p1:= 5
   endif

   do while (.T.)
      for Local1:= 1 to p1
         if (RLock())
            return .T.
         endif
         InKey(0.5)
      next
      if !msgyesno("Registro Bloqueado! Tenta novamente ?")
         return .F.
      endif
   enddo

RETURN( .F. )





function adireg(tempo)
  local loca1
  do while (.T.)
     for Local1:= 1 to tempo
         append blank
         if (!neterr())
            return .T.
         endif
         InKey(0.5)
      next
      if !msgyesno("Arquivo Bloqueado! Tenta novamente ?")
         return .F.
      endif
   enddo

return .T.

* Exemplos:

para abrir os arquivos:

  if OpenFile( ".\dados\orca","or", 1, .F. )
     select or
     or->(dbgotop()) 
  endif


* para travar o registro para alterar ou excluir:

     if reglock(10)   
        replace confbds->contro with "OK"
        replace confbds->contro1 with "OK1"
        dbunlock()
     endif

* para incluir novo registro:

  if adireg(10)
     replace numterm with "01"
     replace conf->t1 with 12
     replace conf->t2 with 18
     dbunlock()
  endif 

 

Aí vc chutou os bagos do João ahahahaha. Jamais cite a palavra ANTIGO para o DBF, né não fofinho? ahahahaha

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...