• 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 uma tabela ou arquivo.

Sintaxe

FLock()

Retorno

Nome

Tipo

Descrição

lRet

lógico

Retorna verdadeiro (.T.), se a tabela for bloqueada com sucesso; caso contrário, falso (.F.).

Observações

  • Esta função é utilizada quando se tem uma tabela aberta, compartilhada e se deseja bloquear toda ela para que outros usuários não possam alterar.
  • Para desbloquear a tabela deve-se utilizar a função DBUnlock.
  • Caso não haja área de trabalho 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 da tabela e retorna .T..
  • Antes de bloquear a tabela é feito a gravação das alterações pendentes. Caso haja erro nessa gravação, o programa será encerrado com ocorrência de erro recuperável "Commit error: (FLock)".
  • Se o arquivo não estiver em um bloco transacionado, será feito o desbloqueio de todos os registros tabela antes de bloqueá-la. Caso haja erro nesse desbloqueio, será apresentada no log de console do AppServer uma mensagem "Warning - FLock - Unlock error".
  • Após a execução de FLock, a chamada a função DBRLockList retorna o valor { 0 }, uma vez que todos os bloqueios de registro foram liberados.
  • O principal motivo de retorno .F. é quando a tabela já foi bloqueada por outro usuário.
  • Se a tabela já estiver bloqueada e a conexão que fez o bloqueio tentar bloquear novamente essa mesma tabela, a função retornará .T..
  • Caso um programa faça mais de uma conexão com o SGBD e a primeira conexão bloquear uma tabela, a segunda conexão consegue desbloquear a mesma tabela. Isso só é possível se as duas conexões partirem da mesma thread.
  • 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.

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 := FLock()                   // Tenta bloquear a tabela indica em cTable
  conout( lRet )                    // Exibe: .T.
  varinfo( "list1", DBRLockList() ) // Exibe: { 0 }
  
  DBCloseArea()
  
  // Abre a tabela em modo compartilhado
  DBUseArea( .T., cRDD, cTable, (cTable), .T., .F. )
  
  lRet := DBRLock( 100 )            // 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.
  
  varinfo( "list2", DBRLockList() ) // Exibe: { 100, 110 }
  
  lRet := FLock()                   // Bloqueia a tabela indica em cTable
  conout( lRet )                    // Exibe: .T.
  varinfo( "list3", DBRLockList() ) // Exibe: { 0 }
  
  // Fecha a tabela
  DBCloseArea()
  
  // Desconecta do SGBD
  TCUnlink( nHandle )
return

O exemplo abaixo espera ser possível fazer o bloqueio de uma tabela, altera vários registros e depois desbloqueia.

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. )
  
  // Espera o bloqueio da tabela ser possível
  while !FLock()
    sleep( 1000 )
  enddo
  
  // Altera o conteúdo do registro 100
  DBGoTo( 100 )
  (cTable)->MYFIELD := "ABCDE"
  
  // Altera o conteúdo do registro 110
  DBGoTo( 110 )
  (cTable)->MYFIELD := "FGHIJ"
  
  // Desbloqueia a tabela
  DBUnlock()
  
  // Fecha a área de trabalho
  DBCloseArea()
  
  // Desconecta do SGBD
  TCUnlink( nHandle )
return

Veja também

  • Sem rótulos