Pergunta

Eu continuo correndo para "enq: TX - linha a disputa do bloqueio", quando eu executar o comando SQL abaixo em um oráculo 9 DB. A tabela minha_tabela é uma pequena mesa, com menos de 300 linhas.

UPDATE MYTABLE
SET     col1 = col1 + :B3 ,
        col2    = SYSDATE
WHERE   :B2            = col3
    AND :B1        = col4

Eu corro 10 threads ao mesmo tempo, e alguns esperar o tempo que 10 segundos para ter a chance de atualização. Eu sei que vou enfrentar este problemas de impasse, mas o problema para mim é que eles devem ser capazes de ser muito mais rápido, uma vez que a tabela é pequena, por isso a atualização seria rápido.

Editar : Eu não pode alterar este código, ele está dentro de um aplicativo de terceiros. Eu só posso ajustar o DB.

o que posso fazer para melhorar a velocidade da fila rowlock? Como posso melhorar este tempo de espera para que meus tópicos correr mais rápido?

Foi útil?

Solução

Se você não quer ser bloqueado não tente atualizar cegamente . Executar uma NOWAIT SELECIONAR FOR UPDATE em primeiro lugar. Se você levantar uma exceção (ORA-00054) Isto significa que uma outra sessão está atualmente trabalhando com essa linha. Nesse caso, dependendo de sua necessidade, você pode tentar atualizar outra linha (você está tentando construir um processo de fila / dequeue?), Espera (dbms_lock.sleep) ou retornar uma mensagem de erro para o aplicativo de chamada.

Você não enfrentam um impasse se você bloquear a linha com FOR UPDATE NOWAIT primeiro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top