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] >