• A Confluence está sendo executada atualmente com todos os plugins que não são do sistema desabilitados. Pode haver perda de algumas funcionalidades

Árvore de páginas

Bloqueia um registro do alias de uma tabela para receber atualizações de valores de campos.

Sintaxe

DBRLock( [ nRec ] )

Parâmetros

Nome

Tipo

Descrição

Obrigatório

Referência

nRec

numérico

Indica o número do registro que será bloqueado.



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. Qualquer tentativa de atualizar um registro de uma tabela aberta sem primeiro obter um bloqueio do registro interrompe a aplicação AdvPL com a ocorrência de erro "Update error - lock required".
  • 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 total de bloqueios efetuados em todas as tabeas abertas e NNN o número de registros bloqueados na tabela informada.
  • Se a tabela está aberta em modo exclusivo ou foi feito um bloqueio total do arquivo através da função FLock, a chamada da função é desnecessária, e retorna .T.
  • O usuário pode escolher o registro que será bloqueado, através do parâmetro nRec, mas se este não for especificado, o registro corrente será bloqueado, como na função RLock. Porém, quando não informamos o parâmetro nRec, é realizado um desbloqueio de todos os registros bloqueados da tabela pelo processo atual, antes de tentar bloquear o registro atual.
  • Esta função funciona de forma oposta a DBRUnlock, que libera os registros bloqueados.
  • O principal motivo de retorno .F. é quando o registro especificado já foi bloqueado por outro usuário em outra conexão. Esta função também retorna .F. caso a tabela atual tenha sido aberta apenas para leitura – vide parametrização de abertura de tabelas na função DBUseArea.
  • 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..
  • O desbloqueio dos registros pode ser realizado pelas funções DBRUnlock e DBUnlock. O fechamento da tabela através das funções DBCloseArea ou DBCloseAll também libera os registros bloqueados pelo processo atual.

Exemplos

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

user function test1()
  Local nHandle := TCLink()
  Local cTable := "MYTABLE"
  Local cRDD := "TOPCONN"
  Local lRet := .F.
  
  // Abre a tabela em modo exclusivo
  DBUseArea( .T., cRDD, cTable, (cTable), .F., .F. )
  
  DBGoTop()
  lRet := DBRLock()       // Tenta bloquear o registro de número 1
  conout( lRet )          // Exibe: .T.
  
  DBCloseArea()
  
  // Abre a tabela em modo compartilhado
  DBUseArea( .T., cRDD, cTable, (cTable), .T., .F. )
  
  DBGoTo( 100 )
  lRet := DBRLock()       // Bloqueia o registro de número 100
  conout( lRet )          // Exibe: .T.
  
  lRet := DBRLock( 110 )  // Bloqueia o registro de número 110
  conout( lRet )          // Exibe: .T.
  
  // 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.

user function test2()
  Local nHandle := TCLink()
  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 !DBRLock()
    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

  • Sem rótulos