Anterior Sumário Próximo OpenBASE! o Banco de Dados inteligente. Fale conosco!

Set Locktest

 

Propósito
Detectar se um registro já se encontra bloqueado por outro processo. Caso não haja bloqueio, o registro será bloqueado, caso contrário não ocorrerá tentativa de bloqueio.


Sintaxe
Set Locktest on off

Utilização
Este comando é útil para que um processo não fique tentando bloquear um registro v’;arias vezes, caso este já esteja bloqueado. Isto evita que a aplicação fique em um logo estado de espera.

Exemplo:
O exemplo a seguir ilustra um caso de uma transação executada corretamente ( ao mesmo tempo ) por vários processos. A tetecção de bloqueio evita possíveis deadlocks além de evitar que a transação fique muito demorada.
Note que para evitar que a transação fique longa e evitar que seja desfeita em caso de erro, todos os ítens da nota fiscal são verificados quando a existência e quantidade em estoque, reservados, e só no fim é que todos os registros referentes ao pedido, são atualizados de uma só vez.


Esquema do banco:
banco .\notfis 1
nome: itens e
numite ( 1 ) n5
nomite u10
qtdite s5
nome : pedidos e
numped ( 1 ) n5
cliente u10
nome : iteped r
numite1 ( itens ) n5
qtdped n5

prog
database .\notfis 1 a 2
Select b
Use itens
Select a
Use pedidos
Select c
Use iteped
Decl it [ 100 ] = 0

Decl qt [ 100 ] = 0
Num =0
Cli = “ “
Ite = 0
Qld = 0
@1, 0 say “Pedido” get num pic “99999”
@2, 0 say “Cliente “ get cli pic “ xxxxxxxxxx “
read
i=0
temerr= . f .
func tesite ( 1 ) , tesqtd ( 1 )
set locktest on
do while . t .
@4, 0 say “item “ get qtd pic “ 999” valid tesite (ite)
&& esta função verifica se o ítem
&& digitado existe no arquivo no arquivo de
&& ítens
@5, 0 say “Qtd “ get qtd pic “ 99999 “ valid tesqtd ( ite, qtd)
&& Esta função verifica se a
&& quantidade para o ítem digitado
&& é menor ou igual a existente
&& no arquivo de ítens.

Read
If lastkey ( ) = 27
Exit
Endif
Select b
Fiind ite exclusive
If dberr ( ) =0
++i
it [ i ] = ite
qt [ i ] = qtd
loop
else
if dberr ( ) = 605
ok= “s “
@23, 0 say “processo “+str ( lockingpid ( ) ) + ; “ bloqueado item . Espera? “ get ok
read
if ok= “s “
sleep 5
it [ i ] = 0
gt [ i ] = 0
-- i
loop
endif
endif
temerr= . t .
unlock && tira bloqueio de leitura feito com o find
&& exclusive

exit
endife
enddo
if . not . temerr
lock undo
select a
replace numped with num, cliente with cli
insert
for j=1 to i
select c
replace numped1 with num, nimite1 with it [ j ], ;
qtdped with qt [ j ]
insert
select b
find it [ j ]
replace qtdite wite qtdite-qt [ j ]
modify
next
unlock
endif
return


 

 

Anterior Sumário Próximo OpenBASE! o Banco de Dados inteligente. Fale conosco!