Oi : sobre a ROW_DEPENDENCIES neca, isso é um atributo FÍSICO da tabela que o 
banco Tem que ser instruído a preencher : se a tabela foi gravada de uma 
maneira no disco sem a informação o passado já foi , afaik só recriando pra que 
vc a possa gravar de outra, com informações adicionais okdoc ?
 Só um ponto aí, muito importante, que vou frisar com *s - na ocasião eu disse 
"...o
ROWSCN, que pode ser usado como
identificador de alteração de registros para locks *** otimistas *** em 
aplicações..."

==> por DEFINIÇÃO, lock Otimista tem esse nome porque ele é um mecanismo criado 
para aplicações aonde é relativamente RARO se obter conflito por lock, ele 
"pensa"/julga que a necessidade de controlar dois registros sendo acessados ao 
mesmo tempo é RARA : mais ou menos o que ocorre em aplicações OLTP padrão.
 No seu caso, vc Claramente diz que VÃO HAVER edições (e alterações, presumo) 
simultâneas no mesmo recurso, o sistema pelo jeito FOI pensado assim, então eu 
Imagino que vc quer um cenário de check in/check out, ou seja,alguém pede pra 
usar o recurso x, se ninguém está usando a pessoa tem sucesso, e no (curto!) 
intervalo de tempo enquanto ele não termina de usar ninguém mais pode usar : 
isso é lógico, pois se A está alterando, como é que B vai ser permitido a 
alterar também ? Quais alterações deveriam permanecer ao final ? Risco Total de 
LOST UPDATE - nesse cenário imho simplesmente Não Cabe lock otimista, vc SABE 
que a esperança otimista é furada... Então eu Acho que para o Seu caso vc 
precisará é de lock PESSIMISTA - isso não deve causar impacto, já que no RDBMS 
Oracle por definição :

 a) locks NUNCA bloqueiam/impedem SELECTs 

 b) não há uma lista de locks possíveis do sistema, locks Não São um recurso 
escasso a controlar - um banco Oracle com centenas e centenas de locks vão se 
comportar muitíssimo similar a um com dez locks ativos...

 Então, se o seu objetivo é impedir que o usuário B altere um registro/recurso 
enquanto este já está sendo alterado pelo usuário A, vc simplesmente locka o 
registro e o SELECT que traz os dados é um SELECT FOR UPDATE , aí se alguém já 
recuperou e está alterando o registro o SELECT falha, e a aplicação joga pro 
usuário uma mensagem "Este registro está sendo alterado pelo usuário X, por 
favor tente mais tarde a sua pesquisa"...
 
 []s

   Chiappa

--- Em oracle_br@yahoogrupos.com.br, Rafael Bahr Esposito da Rocha 
<rocha.oracle@...> escreveu
>
> Bom dia,
> 
> Estou com o seguinte problema:
> 
> Possuo uma tabela com edição constante de registros e preciso controlar de 
> forma eficiente as edições concorrentes pois 
> trata-se de um processo de aprovação com n níveis e após um usuário realizar 
> a aprovação outro não pode aprovar em cima 
> se ambos estiver com o mesmo registro em "tela".
> 
> A opção encontrada por enquanto foi o ora_rowscn.
> 
> A idéia inicial é trazer o ora_rowscn ao buscar os dados, e posteriormente ao 
> gravar, selecionar o ora_rowscn dos 
> registros editados para verificar se houve ou não alteração durante o 
> intervalo em que os dados estiveram em edição.
> 
> Caso tenha ocorrido a edição, parte para a gravação do próximo registro, e 
> por fim apenas traz uma listagem dos 
> registros que não foram editados, por terem sido alterados.
> 
> A princípio este tratamento funciona perfeitamente, a não ser por uma 
> questão, a tabela que eu preciso controlar a 
> edição concorrente, não foi criada com rowdependencies.
> 
> Como preciso controlar a edição registro a registro, existe a necessidade de 
> criar esta tabela com o parâmetro 
> rowdependencies... porém isto se torna inviável visto que esta tabela 
> encontra-se com grande número de dados e possui 
> ligações com várias oturas tabelas, impossibilitando a recriação da mesma. 
> Pelo que entendi algumas documentações é que 
> senão usar o rowdependencies vários registros ficam com o mesmo rowscn e 
> quando um é editado todos sofrem alteração... é 
> isto mesmo?
> 
> Gostaria de saber se existe a possibilidade de alterar esta tabela para 
> utilizar o parâmetro rowdependencies, sem que 
> seja necessário recriá-la.
> 
> *Versão oracle: 10.2.0.3*
> 
> Atenciosamente,
> 
> Rafael Bahr
> 
> 
> 
> 
> PS: a idéia de utilizar o rowscn veio a partir do e-mail abaixo enviado pelo 
> Chiappa.
> 
> -------- Mensagem original --------
> Assunto:      Re: Res: [oracle_br] lock na tabela
> Data:         Sat, 26 Mar 2011 18:10:52 -0000
> De:   José Laurindo <jlchiappa@...>
> Responder a:  oracle_br@yahoogrupos.com.br
> Para:         oracle_br@yahoogrupos.com.br
> 
> 
> 
> Márcio, vc está corretíssimo mas o Élcio frisa que ele está trabalhando em 
> MODO WEB, e tipicamente quando vc está 
> desenvolvendo uma aplicação WEB vc não só tem que atender muitos e muitos 
> usuários simultâneos quanto também (se a 
> aplicação for acessada externamente) vc Não Tem como garantir que a conexão 
> de rede entre o servidor e o usuário vai 
> estar 100% ativa o tempo todo : por causa disso , tipicamente em modo WEB a 
> aplicação NÂO FICA conectada no banco de 
> modo constante, ao invés ela conecta, recebe uma informação do banco e já 
> desconecta, liberando recurso pra outras 
> sessões, quando necessário enviar/receber mais info do banco conecta de novo 
> e tão logo possível desconecta.... Além 
> disso, é típica nesse ambiente a figura do POOL DE CONEXÕES, ie : as conexões 
> tão lá criadas no banco, quando um usuário 
> precisa ele "recebe" permissão de uso de uma das conexões do pool, usa 
> rapidamente e a libera, permitindo que essa mesma 
> conexão atenda outra sessão, e outra e outra depois...
> Em resumo, por causa das causas de escalabilidade e rede acima expostas via 
> de regra em modo WEB vc NÃO É ATENDIDO pela 
> mesma conexão, vc Não Pode deixar uma conexão monopolizada por um usuário 
> eventualmente esperando o lock de outro ser 
> liberado, então se usa o chamado OPTIMISTICK LOCK : os livros do Tom Kyte 
> discutem bem isso (e Élcio, fica aqui a *** 
> Enfática *** recomendação de leitura pra vc) , mas basicamente falando, no 
> lock otimista cada vez que a pessoa lê um 
> registro vêm junto um identificador (normalmente numérico) que cresce, E 
> assim que alguém que tinha o registro na tela 
> fez alterações e clicka no botão de SAVE, a aplicação vai no banco 
> rapidamente , vê se o identificador mudou, se não 
> mudou OK, rapidamente ela manda o UPDATE pro banco E O COMMIT em seguida, e 
> se preciso altera o identificador (não há 
> PENDÊNCIA , não há Espera) , aí os outros usuários que leram o registro ainda 
> estão na tela com o identificador 
> "antigo", quando alterarem algo e clickarem no SAVE a aplicação vê que o 
> identificador já mudou, dá um erro de 'registro 
> já alterado por outro usuário' ....
> 
> Inclusive, no banco Oracle 10g, a Oracle já nos dá uma feature muito útil , o 
> ROWSCN, que pode ser usado como 
> identificador de alteração de registros para locks otimistas em aplicações 
> que não mantém conexão aberta : 
> http://husnusensoy.wordpress.com/2007/07/28/a-locking-mechanism-in-oracle-10g-for-web-applications/
>  explica bem sobre a 
> técnica, e se vc pesquisar por ora_rowscn no site-referência pra utilizadores 
> de bd Oracle (http://asktom.oracle.com) vc 
> acha MUITOS artigos excelentes, como 
> http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:22948373947565
>  , 
> http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:5809900747879#2194281500346636291
>  e 
> http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:2680538100346782134#2680546500346035086
>  .
> 
> Já se a aplicação do Élcio for intranet (ie, modo web mas usado dentro da 
> mesma rede do servidor, e por um número 
> relativamente restrito de usuários simultâneos) , aí sim ele pode deixar o 
> LOCK em aberto, como sugerido - normalmente, 
> pra ecvitar que o segundo cara fique "pendurado" esperando pelo primeiro, 
> usa-se o PESSIMISTICK LOCK , ie : na hora que 
> alguém tenta ler o registro já se mete um FOR UPDATE NOWAIT no SELECT, se deu 
> sucesso OK, se não deu sucesso o banco 
> retorna um erro e a aplicação joga pro usuário msg de registro em uso...
> 
> []s
> 
> Chiappa
>


Responder a