Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.
Composition Setup
import.css=/download/attachments/3279126062824/newLayouttecnologia.css
Portuguese

Pagetitle

...

...

RLock

RLock

Bloqueia

...

somente o

...

registro

...

atual.

Sintaxe

Bloco de código
collapsefalse
RLock()
--> lRet

Retorno

Nome

Tipo

Descrição

lRet

...

lógico

Retorna verdadeiro (.T.), se o registro for bloqueado com sucesso; caso contrário, falso (.F.)

...

.

...

Observações

  • Esta função é utilizada quando se tem uma tabela aberta,

...

  • compartilhada e se deseja bloquear um registro para que outros usuários não possam alterá-lo

...

  • .
  • Caso não haja tabela aberta, o programa será encerrado com ocorrência de erro recuperável "Work area not in use".
  • Caso o número de bloqueios exceda o limite indicado pela chave MaxLocks (valor padrão: 10000), o programa será encerrado com ocorrência de erro fatal "Number of locks exceeded - Total: TTT File: NNN", onde TTT é o número de bloqueios efetuados e NNN o número de registros bloqueados.
  • Se a tabela

...

  • está aberta em modo exclusivo, a função não altera o bloqueio do registro e retorna .T..
  • Ao bloquear o registro atual, é realizado um desbloqueio de todos os registros bloqueados da tabela antes de bloquear o registro atual. Caso haja erro nesse desbloqueio, será apresentada no log de console do AppServer uma mensagem "Warning - DBRLock - Unlock error".
  • Essa função funciona exatamente como a função DBRLock quando chamada sem parâmetros.
  • O principal motivo de retorno .F. é quando o registro já foi bloqueado por outro usuário.
  • Se um registro já estiver bloqueado e a conexão que fez o bloqueio tentar bloquear novamente esse mesmo registro, a função retornará .T..
  • Caso um programa faça mais de uma conexão com o SGBD, a primeira conexão bloquear um registro, e a segunda conexão tentar atualizar esse registro, o programa será encerrado com ocorrência de erro recuperável "Update error - lock required". Contudo, se a segunda conexão fizer o bloqueio antes de atualizar, o bloqueio será efetuado e o registro poderá ser modificado.
  • A função DBCloseArea remove todos os bloqueios realizados.

Exemplos

O exemplo abaixo utiliza a RDD "TOPCONN", mas a função pode ser utilizada com qualquer uma das RDDs válidas.

Bloco de código
languagecpp
themeEclipse
linenumberstrue
collapsefalse
user function test1()
  Local nHandle := TCLink( "MSSQL/DSN1", "127.0.0.1", 7890 )
  Local cTable := "MYTABLE"
  Local cRDD := "TOPCONN"
  Local lRet := .F.
  
  // Abre a tabela em modo exclusivo
  DBUseArea( .T., cRDD, cTable, (cTable), .F., .F. )
  
  DBGoTop()
  lRet := RLock()                   // Tenta bloquear o registro de número 1
  conout( lRet )                    // Exibe: .T.
  varinfo( "list1", DBRLockList() ) // Exibe: { 0 }
  
  DBCloseArea()
  
  // Abre a tabela em modo compartilhado
  
seu estado.
  • O usuário pode escolher o registro que será bloqueado, através do parâmetro <nRegistro>, mas se este não for especificado, o registro corrente será bloqueado como na função RLock().
  • Esta função funciona de forma oposta a DBRUnlock(), que libera os registros bloqueados.
  • //Este exemplo, apresenta duas maneiras de utilizar a função DBRLock().
    DBUseArea( .T.,
    "dbfcdxads"
     cRDD, 
    "\dadosadv609\sa1990.dbf","SSS",
    cTable, (cTable), .T., .F. )

    
      
      DBGoTo( 100
    )
    DBRLock()
     )
      lRet := RLock()                   // Bloqueia o registro
    atual (100)
    DBRLock(110)
     de número 100
      conout( lRet )                    // Exibe: .T.
      varinfo( "list2", DBRLockList() ) // Exibe: { 100 }
      
      lRet := RLock( 110 )              // Bloqueia o registro de número 110
     
    Advanced Protheus 6.09 , Advanced Protheus 7.10 , Microsiga Protheus 8.11 , Protheus 10 , TOTVS Application Server 10 , ByYou Application Server
     
     conout( lRet )                    // Exibe: .T.
      varinfo( "list3", DBRLockList() ) // Exibe: { 110 }
      
      // Fecha a tabela
      DBCloseArea()
      
      // Desconecta do SGBD
      TCUnlink( nHandle )
    return
    

    O exemplo abaixo espera ser possível fazer o bloqueio de um registro, altera e depois desbloqueia.

    Bloco de código
    languagecpp
    themeEclipse
    linenumberstrue
    collapsefalse
    user function test2()
      Local nHandle := TCLink( "MSSQL/DSN1", "127.0.0.1", 7890 )
      Local cTable := "MYTABLE"
      Local cRDD := "TOPCONN"
      Local lRet := .F.
      
      // Abre a tabela em modo compartilhado
      DBUseArea( .T., cRDD, cTable, (cTable), .T., .F. )
      
      DBGoTo( 100 )
      
      // Espera o bloqueio ser possível
      while !RLock()
        sleep( 1000 )
      enddo
      
      // Altera o conteúdo do registro
      (cTable)->MYFIELD := "ABCDE"
      
      // Desbloqueia o registro
      DBRUnlock( 100 )
      
      // Fecha a tabela
      DBCloseArea()
      
      // Desconecta do SGBD
      TCUnlink( nHandle )
    return
    

    Veja também