Exclusive lock

130 views
Skip to first unread message

jhonson

unread,
Oct 1, 2008, 5:44:01 PM10/1/08
to Progress - 4GL
Quando vou dar um for each em uma tabela: for each tit-ap no-lock
where....., insiro os parâmetros que desejo com a opção no-lock.

Imagine a seguinte situação: Várias pessoas utilizam um determinado
programa, só que por faixa de valores, por exemplo, uma pessoa
acessará títulos de R$ 1,00 a R$ 1.000,00, outra pessoa acessará
títulos na faixa de R$ 1.001,00 a R$ 5.000,00, e assim sucessivamente.
Se eu usar o comando exclusive-lock no for each, toda a tabela ficará
bloqueada para outros usuários que desejarem utilizá-la.
Há como eu bloquear apenas os títulos de acordo com a faixa de valores
que o usuário está acessando? No exemplo que citei, o usuário que
estiver alterando os títulos na faixa de valores de R$ 1,00 a R$
1.000,00, bloquear os outros usuários que tentem acessar os títulos
somente nesta faixa de valores?
Isso é possível?

Wanderley S

unread,
Oct 1, 2008, 9:46:51 PM10/1/08
to Progre...@googlegroups.com
Jhonson,
 
Boa noite,
 
Ao utilizar o exclusive-lock, a cada interação do for each, apenas o registro corrente ficará bloqueado. Não haverá qualquer problema no uso normal com o for each. Ele só prenderia todos os registros se vc utilizasse um do transaction e o bloco do for each dentro do do...
 
Ex. 1: Nesse exemplo TODOS os registros que atenderem a clásula where ficarão presos.
 
do transaction:
 
    for each tit-ap where vl... >= 1 and vl... <= 1000
        exclusive-lock:
 
 
    end.
 
 
end. /* do transaction*/
Ex. 2: Nesse exemplo apenas o registro corrente do for each ficará bloqueado. Os demais não estarão bloqueados.
 
    for each tit-ap where vl... >= 1 and vl... <= 1000
        exclusive-lock:
 
 
    end.
 
O progress trabalha com lock em nível de registro, por essa razão apenas o registro corrente dentro do for each fica bloqueado. É importante também jamais utilizar share-lock (no caso, se não informar no-lock ou exclusive-lock).
 
Cuidado também para não "quebrar" os indices da tabela através da cláusula where.
 
Espero ter ajudado.
 
Sds,
 
Wander.

 
2008/10/1 jhonson <jonas...@gmail.com>

MARCOS BATISTA

unread,
Oct 2, 2008, 7:09:35 AM10/2/08
to wand...@gmail.com, Progre...@googlegroups.com, br-pr...@yahoogrupos.com.br
Isto mesmo, o Progress realiza o lock de registro, não da tabela como um todo.Mas vale ressaltar que o lock ocorre para o registros lidos para a shred-memory do servidor, ou melhor, os registros que o "motor" do banco de dados leu para te dar a resposta, ou seja, se o índice usado não for adequado, você corre o risco da tabela toda ser lida, mas se usar o índice adequado, isto não ocorrerá.

Assim, um CAN-FIND com uma cláusula de where mau elaborada em relação aos índices disponíveis, pode ler todas a tabela para retornar um YES/NO dizendo se o registro que você pediu existe ou não..
O Manual anexo pode ajudar neste sentido.
Este manual foi baixado da Intenet, apenas fizemos uns ajustes nele.

sds
Batista
>>> wand...@gmail.com 01/10/2008 22:46:51 >>>
--
Abraço,

Wanderley.

"Nada baixa mais o nível da conversa do que elevar a voz"

Stanley Horowitz



manual de performance progress.doc

jhonson

unread,
Oct 2, 2008, 12:17:21 PM10/2/08
to Progress - 4GL
Obrigado pelas dicas

Nos dois exemplos passados, para o meu caso o mais interessante seria
o exemplo 1, onde é usado o comando "do transaction", pois quero que
os registro que o usuário estiver consultando/alterando, não sejam
acessados por outro usuário ao mesmo tempo.
Mas tenho mais uma dúvida: em relação ao índice, estou utilizando um
índice que compreende data de vencimento e código do estabelecimento.
Dentro do for each faço as verificações de espécie, série, valor
(estes dados são fornecidos pelo usuário). Se eu amarrar estes dados
no for each posso ter queda de performance? por exemplo:
do transaction:
for each tabela use-index data no-lock where dt-venc >= data1 and
dt-venc <= data2 and

cod-estab >= x and cod-estab <= y and

cod-esp >= a and cod-esp <= b and

serie >= c and serie <= d and

valor >= e and valor <= f:
/*comandos*/
end.
end.

Neste caso, como o índice da tabela compreende os campos dt-venc e cod-
estab, a pesquisa ficaria mais lenta?
Ao invés de fazer as verificações dentro do for each, eu verificarei
direto na cláusula where do for each.

Obrigado

On 2 out, 08:09, "MARCOS BATISTA" <BATI...@agraria.com.br> wrote:
> Isto mesmo, o Progress realiza o lock de registro, não da tabela como um todo.Mas vale ressaltar que o lock ocorre para o registros lidos para a shred-memory do servidor, ou melhor, os registros que o "motor" do banco de dados leu para te dar a resposta, ou seja, se o índice usado não for adequado, você corre o risco da tabela toda ser lida, mas se usar o índice adequado, isto não ocorrerá.
>
> Assim, um CAN-FIND com uma cláusula de where mau elaborada em relação aos índices disponíveis, pode ler todas a tabela para retornar um YES/NO dizendo se o registro que você pediu existe ou não..
> O Manual anexo pode ajudar neste sentido.
> Este manual foi baixado da Intenet, apenas fizemos uns ajustes nele.
>
> sds
> Batista>>> wander...@gmail.com 01/10/2008 22:46:51 >>>
> 2008/10/1 jhonson <jonas.ne...@gmail.com>
>
>
>
>
>
>
>
> > Quando vou dar um for each em uma tabela: for each tit-ap no-lock
> > where....., insiro os parâmetros que desejo com a opção no-lock.
>
> > Imagine a seguinte situação: Várias pessoas utilizam um determinado
> > programa, só que por faixa de valores, por exemplo, uma pessoa
> > acessará títulos de R$ 1,00 a R$ 1.000,00, outra pessoa acessará
> > títulos na faixa de R$ 1.001,00 a R$ 5.000,00, e assim sucessivamente.
> > Se eu usar o comando exclusive-lock no for each, toda a tabela ficará
> > bloqueada para outros usuários que desejarem utilizá-la.
> > Há como eu bloquear apenas os títulos de acordo com a faixa de valores
> > que o usuário está acessando? No exemplo que citei, o usuário que
> > estiver alterando os títulos na faixa de valores de R$ 1,00 a R$
> > 1.000,00, bloquear os outros usuários que tentem acessar os títulos
> > somente nesta faixa de valores?
> > Isso é possível?
>
> --
> Abraço,
>
> Wanderley.
>
> "Nada baixa mais o nível da conversa do que elevar a voz"
>
> Stanley Horowitz
>
>  manual de performance progress.doc
> 490KExibirDownload- Ocultar texto entre aspas -
>
> - Mostrar texto entre aspas -

MARCOS BATISTA

unread,
Oct 2, 2008, 2:02:59 PM10/2/08
to jonas...@gmail.com, Progre...@googlegroups.com
O melhor é você uasr a cláusula de where para todas as condições possíveis e necessárias.

No caso em questão, o banco de dados, necessariamente, lerá TODOS os registros compreendidos no range "dt-venc >= data1 and dt-venc <= data2", independente das outras cláusulas do where.
Isto porque o teu índice contém a data de vencimento, e como você usou uma condição de ">=", o Progress não usará o
cod-estab do índice.

Se o intevalo que o usuário normalmente pede não for grande, seu relatório não será lente.

Nós aqui até chegamos a restringir o intervalo de datos que o usuário pode pedir. Se ficar em aberto, você corre o risto e alguém pedir um relatório enorme, comprometendo a performance de todo o sistema, isto é claro dependendo da sua infra-estrutura de hardware. Mas no geral, é assim.

O Progress é cruel neste sentido.

sds
Batista

>>> jonas...@gmail.com 02/10/2008 13:17 >>>
Reply all
Reply to author
Forward
0 new messages