Histórico da Página
Composition Setup |
---|
import.css=/download/attachments/3279126062824/newLayouttecnologia.css |
Pagetitle | ||||
---|---|---|---|---|
|
Função: RLock
Bloqueia
...
somente o
...
registro
...
atual.
Sintaxe
Bloco de código | ||
---|---|---|
| ||
RLock() |
...
|
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 | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
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
DBUseArea( .T., cRDD, cTable, (cTable), .T., .F. )
DBGoTo( 100 )
lRet := RLock() // Bloqueia o registro de número 100
conout( lRet ) // Exibe: .T.
varinfo( "list2", DBRLockList() ) // Exibe: { 100 }
lRet := RLock( 110 ) // Bloqueia o registro de número 110
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 | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
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
Visão Geral
Import HTML Content
Conteúdo das Ferramentas
Tarefas