No e-mail original vc tinha dito :

"..tenho uma tabela preciso fazer um select de um registro travando
esse registro e alterando ele" ... "Porem quando outra sessao efetuar
o mesmo select , o registro travado nao pode vir e sim o proximo
destravado ."

é o que eu fiz, ok ? INCLUSIVE, diferentes execuções duma proc ***
NECESSARIAMENTE *** vão sim estar em sessões difentes, então a técnica
de pular os regs lockados que eu empreguei funcionaria, sim...E outra,
 o que acontece na procedure é que normalmente vc tem uma ARGUMENTO
indicando qual o registro que vc quer selecionar e updatear, então
essa lógica de "buscar o próximo" sorry mas penso que ainda não faz
muito sentido... E outra, tal como eu disse, normalmente se vc quer
ter várias sessões fazendo um processamento, Parallel SQL é a
indicação....
  Também não faz sentido "procedure chamada 2x no mesmo milisegundo" -
que tipo de sistema vc está construindo que exige isso ??? Normalmente
OU um sistema é OLTP (aonde o usuário consulta um ou mais registros,
os analisa na tela e pode ou não desejar alterá-los) ou é BATCH (aonde
há a figura da carga de dados, que tipicamente TEM que ser completada
antes de qquer consulta, então a´entra a figura do parallel sql)....
Explique direito o que vc quer fazer, que tipo de sistema vc está
construindo, o seu ambiente (se modo c/s ou web), pra gente poder
entender melhor a sua necessidade...

[]s

  Chiappa 
--- Em oracle_br@yahoogrupos.com.br, Manuel Acacio Ludgero Domingos
<[EMAIL PROTECTED]> escreveu
>
> 
> Entao não eh bem isso ,
>  
> A situacao eh a seguinte tenho uma proc que ira selecionar um
registro e depois fazer update nele , porem essa proc vai ser chamada
em em paralelo podendo ser chamado no mesmo milesimo de segundo ,
preciso impedir q em uma chamada x o mesmo registro seja chamado na
x+1 , e nao posso deixar a chamada esperando com wait, o exemplo
abaixo daria certo , se eu pudesse efetuar a leitura da tabela inteira
porem eu nao posso pq a proc deve rodar em questão de milessegundo e
preciso prever a volumetria da tabela , uma ideia seria colocar o
rownum = 1 , mas mesmo no exemplo abaixo se no select do for eu
colocasse rownum = 1 , retornaria somente a primeira vez , e a segunda
e a terceira daria no_data_found , pq o oracle monta o rownum antes de
dar lock e o mesmo se eu colocasse for update skip locked .
>  
> Dei um jeito colocando o select em um cursor e dando somente um
fetch , porem nao tem rownum no select sendo assim executa o plano
todo , perdendo performance .
>  
> Acho q ficou mais claro , veja bem não é ilógico me expressei mal no
outro email :)
>  
> Se puder me ajudar eu agradeço muito.
>  
> Acacio
> 
> 
> To: [EMAIL PROTECTED]: [EMAIL PROTECTED]: Thu, 22 May 2008 15:38:34
+0000Subject: [oracle_br] Re: Duvida sobre Deadlock
> 
> 
> 
> 
> Colega, esse método de trabalho é absolutamente ESTRANHO, não
vejomuito sentido nisso : veja, se eu quero ler a informação eu quero
lerTODA a informação que existe de acordo com os meus critérios
depesquisa, só depois se eu for alterar aí sim se mais alguém
alterouantes eu recebo um msg de erro, acho que nâo receber a
informaçâo queexiste só porque alguém a consultou antes, E receber a
informação numaeventual próxima consulta se o lock já foi removido
(mesmo semalteração!) deve ser EXTREMAMENTE CONFUSO pro usuário, não é
de modoALGUM um procedimento padrão e recomendado isso .... E lógico,
se éuma programa que está fazendo processo em background, pra vc
tervárias leituras simultâneas (cada sessão fazendo uma leitura de
umaparte) é para isso que foi inventado o PARALLEL SQL... Ou pelo
menosse poderia fazer Parallel DIY, na mão, via rowid, procure
emasktom.oracle.com que vc acha exemplos...Bom, mas sim, dá pra fazer,
é algo totalmente sem sentido mas dá prafazer, mas é em PL/SQl e não
em SQL, exemplo (LOGICAMENTE isso sófunciona entre sessões DIFERENTES,
na mesma sessão que fez o lock ela"vê" tudo, lógico)
:[EMAIL PROTECTED]:SQL>select empno, ename, sal from emp order by sal;EMPNO
ENAME SAL------------------ ---------- ------------------7369 SMITH
8007900 JAMES 9507876 ADAMS 11007521 WARD 12507654 MARTIN 12507934
MILLER 13007844 TURNER 15007499 ALLEN 16007782 CLARK 24507698 BLAKE
28507566 JONES 29757788 SCOTT 30007902 FORD 30007839 KING 500014
linhas selecionadas.==> numa sessão 1 quero ler e travar o primeiro
registro NA ORDEMdesejada (ordem é fundamental aqui, NÃO EXISTE ordem
"natural" numatabela) :scott#1:SQL>edGravou file afiedt.buf1 DECLARE2
resource_busy exception;3 pragma exception_init( resource_busy, -54
);4 v_reg EMP%rowtype;5 BEGIN6 for x in ( select rowid rid from emp
order by sal)7 loop8 Begin9 select * into v_reg from emp where rowid =
x.rid forupdate nowait;10 dbms_output.put_line('Emp=' || v_reg.empno11
|| ',Name=' || v_reg.ename12 || ',Sal=' || v_reg.sal);13 exit;14
Exception15 when resource_busy then16 null;17 End;18 end loop;19*
END;scott#1:SQL>/Emp=7369,Name=SMITH,Sal=800Procedimento PL/SQL
concluído com sucesso.==> na sessão 2, pulei o registro lockado pela
sessão 1 ....scott#2:SQL>DECLARE2 resource_busy exception;3 pragma
exception_init( resource_busy, -54 );4 v_reg EMP%rowtype;5 BEGIN6 for
x in ( select rowid rid from emp order by sal)7 loop8 Begin9 select *
into v_reg from emp where rowid = x.rid forupdate nowait;10
dbms_output.put_line('Emp=' || v_reg.empno11 || ',Name=' ||
v_reg.ename12 || ',Sal=' || v_reg.sal);13 exit;14 Exception15 when
resource_busy then16 null;17 End;18 end loop;19 END;20
/Emp=7900,Name=JAMES,Sal=950Procedimento PL/SQL concluído com
sucesso.==> sessão 3, pulei o lock da sessão 1 e da sessão 2, achando
opróximo não-locakdo e o lockando :scott#3:SQL>DECLARE2 resource_busy
exception;3 pragma exception_init( resource_busy, -54 );4 v_reg
EMP%rowtype;5 BEGIN6 for x in ( select rowid rid from emp order by
sal)7 loop8 Begin9 select * into v_reg from emp where rowid = x.rid
forupdate nowait;10 dbms_output.put_line('Emp=' || v_reg.empno11 ||
',Name=' || v_reg.ename12 || ',Sal=' || v_reg.sal);13 exit;14
Exception15 when resource_busy then16 null;17 End;18 end loop;19
END;20 /Emp=7876,Name=ADAMS,Sal=1100Procedimento PL/SQL concluído com
sucesso.[]sChiappa--- Em oracle_br@yahoogrupos.com.br, Manuel Acacio
Ludgero Domingos<acacio_domingos@> escreveu>> > Pessoal , estou com um
problema e talvez vc´s possam me ajudar.> > Seguinte tenho uma tabela
preciso fazer um select de um registrotravando esse registro e
alterando dele , utilizei o select for updateskip locked para travar e
desprezar os travados.> > Porem quando outra sessao efetuar o mesmo
select , o registrotravado nao pode vir e sim o proximo destravado .>
> estou colocando no select um rownum = 1 para q soh retorne uma
linha, com isso no segundo select ele despreza o locked e retorna um
nodata found pq o rownum = 1 ta locked..> > Uma solucao seria dar um
select por fora e popular o rownum , ouchamar um dense_rank da vida ,
porem nao posso ler a tabela toda pqela eh grande e essa proc tem q
rodar em questao de milissegundos> > Alguem tem ideia?> >
Atenciosamente> Acacio>
__________________________________________________________> Receba
GRÁTIS as mensagens do Messenger no seu celular quando vocêestiver
offline. Conheça o MSN Mobile!>
http://mobile.live.com/signup/signup2.aspx?lc=pt-br> > [As partes
desta mensagem que não continham texto foram removidas]> 
> 
> 
> 
> 
> 
> 
> _________________________________________________________________
> Cansado de espaço para só 50 fotos? Conheça o Spaces, o site de
relacionamentos com até 6,000 fotos!
> http://www.amigosdomessenger.com.br
> 
> [As partes desta mensagem que não continham texto foram removidas]
>


Responder a