Pergunta

Para emitir lidar com concorrência, é locking-- qualquer forma de bloqueio, quer se trate de linha, mesa ou banco de dados bloqueando uma boa solução?

Se não, como lidar com problema de concorrência?

Foi útil?

Solução

Se você acredita Oracle, não, não em todos. Isso porque a Oracle fez um grande esforço para evitá-lo.

O problema é que os leitores podem bloquear leitores escritores e escritores bloco, e um escritor tem que esperar até que todos os leitores têm terminou com uma fileira antes que ele possa escrever. Que atrasa o processo de escrita e seu chamador. bloqueios exclusivos (para escrita) são realizadas ao final da transação, caso a transação deve ser revertida -. este pára outras transações vendo o novo valor até que os commits transação

bloqueio prática Na é geralmente bem se não há muita disputa, o mesmo que com qualquer programação concorrente. Se há muita disputa por uma linha / page / table (não muitos servidores de banco de dados faz-toda DB locking), ele fará com que as transações para executar, por sua vez, em vez de simultaneamente.

A Oracle usa, onde em vez de bloquear uma linha de escrevê-lo, uma nova versão da linha é criada em vez de versão de linha. Os leitores que precisam repetir a sua lê lembrar que versão da linha que lêem. No entanto, um erro ocorrerá se um leitor que está se lembrando sua lê tenta atualizar uma linha que foi atualizado por um outro escritor uma vez que esta transação lê-lo; isso é parar de atualizações perdidas. Para garantir que você pode atualizar uma linha, você tem que dizer que o SELECT é FOR UPDATE; se você fizer isso, é preciso um lock -. apenas uma transação pode manter uma linha FOR UPDATE de cada vez, e uma transação conflitantes tem que esperar

SQL Server 2005 e posterior suporte Snapshot Isolation, que é o seu nome para row-versionamento. Mais uma vez, você deve pedir bloqueios de atualização se você precisar atualizar alguns dados que você acabou de ler -. No SQL Server, uso COM (UPDLOCK)

Um outro problema com o bloqueio é a probabilidade de bloqueios. Isto é simplesmente onde duas transações por realizar um bloqueio em um recurso as outras necessidades, ou no ciclo de um general de transações mantêm bloqueios que cada outra necessidade para o progresso. O servidor de banco de dados irá geralmente detectar este impasse e matar uma das transações, rolando-lo de volta - então você precisa repetir a operação. Qualquer situação em que você tem várias transações concorrentes modificando as mesmas linhas tem potencial para impasse. O impasse ocorrerá se as linhas são tocados em uma ordem diferente; é muito difícil de fazer cumprir a ordem que o servidor de banco de dados irá usar (geralmente você deseja que o otimizador para escolher a ordem mais rápido, que não será necessariamente consistente em diferentes consultas).

Geralmente eu sugiro o mesmo que com rosca -. Ir com fechaduras até que você pode provar que eles estão causando um problema de escalabilidade, em seguida, trabalhar para fora como fazer lock-livre das seções mais críticas

Outras dicas

Você tem que primeiro definir seu objetivo. Em caso de pedido simultâneo que gostaria de ganhar o último usuário ou o primeiro usuário. bloqueio de banco de dados é certamente uma maneira ruim. Tente bloquear a tabela / linhas o mais tarde possível e liberação de bloqueio o mais cedo possível.

bloqueio de banco de dados - em oposição a mesa ou bloqueio de linha - é uma má maneira de lidar com a concorrência; que exclui a concorrência.

Há muitos alternativa razoável a ter que DMBs código de bloqueio de algum tipo si mesmo. Tenha em mente a algum tipo de bloqueio realmente está sempre acontecendo (ações atômicas, etc.), mas o fundamental é que você não quer ir para lá se você não tem que. Você não quer jantar com os filósofos se você não tem que. Transações são uma maneira de contornar o bloqueio, mas isso é principalmente para commits. Usando um campo que as marcas / indica que o registro está sujo o (padrão sujo bit) é uma outra maneira, apenas certifique-se que você está fazendo isso de uma maneira acesso atômica. A língua tem muitas vezes uma solução adequada como referenciado pelo posts anteriores, no entanto a língua normalmente só suporta aplicativo, processo para processo, a simultaneidade nível e, por vezes, a simultaneidade tem de ser no banco de dados. Eu não queria assumir que tem uma camada de aplicativo rico, mas se você fizer isso há muitas camadas de abstração que lidar com isso para você. TopLink pela Oracle é gratuito e é o irmão mais robusto do Hibernate ambos os quais ajudam a gerenciar seus desafios de simultaneidade de banco de dados através da abstração, pedaços sujos, cache e bloqueio preguiçoso. Você realmente não quero implementar estes você mesmo, a menos que você está codificando para uma escola ou projeto pessoal. Entender o problema, mas ficar sobre os ombros de gigantes.

Acho que não, porque é todo o caminho "para baixo" e torna a sua aplicação mais complexa. A maioria das línguas têm excelente concorrência técnicas de manejo, e até então a melhor maneira é escrever código que pode lidar com concorrência "nativamente".

Para mais informações sobre a simultaneidade em Java: http://java.sun.com/docs/books/ tutorial / essencial / simultaneidade / index.html

Você quer dizer a simultaneidade punho em seu aplicativo, ou para resolver um problema de concorrência que você está tendo com o banco de dados. No primeiro caso, não me parece uma boa abordagem. Neste último caso, esta pode ser sua única resposta, sem re-engenharia seus esquemas.

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