Duplicar pergunta de:
/programming/129329/optimistic-vs-pessimistic-locking
Copie / cole a resposta no link acima:
O bloqueio otimista é uma estratégia em que você lê um registro, anota o número da versão e verifica se a versão não foi alterada antes de gravar o registro. Ao gravar o registro, você filtra a atualização na versão para garantir que ela seja atômica. (ou seja, não foi atualizado entre quando você verifica a versão e grava o registro no disco) e atualiza a versão em uma ocorrência.
Se o registro estiver sujo (ou seja, versão diferente da sua), você abortará a transação e o usuário poderá reiniciá-la.
Essa estratégia é mais aplicável a sistemas de alto volume e arquiteturas de três camadas em que você não mantém necessariamente uma conexão com o banco de dados para sua sessão. Nessa situação, o cliente não pode realmente manter bloqueios de banco de dados, pois as conexões são obtidas de um pool e você pode não estar usando a mesma conexão de um acesso para o próximo.
Bloqueio pessimista é quando você bloqueia o registro para seu uso exclusivo até terminar com ele. Ele tem uma integridade muito melhor do que o bloqueio otimista, mas exige que você tenha cuidado com o design do aplicativo para evitar conflitos. Para usar o bloqueio pessimista, você precisa de uma conexão direta com o banco de dados (como seria o caso em um aplicativo de servidor cliente de duas camadas) ou um ID de transação disponível externamente que possa ser usado independentemente da conexão.
No último caso, você abre a transação com o TxID e reconecta usando esse ID. O DBMS mantém os bloqueios e permite que você selecione a sessão novamente através do TxID. É assim que as transações distribuídas usando protocolos de confirmação de duas fases (como transações XA ou COM +) funcionam.
Editar (Adicionando mais informações para resolver a questão de desempenho):
Em termos de desempenho, depende do seu ambiente. Considere os seguintes fatores para decidir:
você achará que otimista será melhor devido à concorrência na maioria das situações. Dependendo do RDBMS e do ambiente, esse desempenho pode ter um desempenho menor ou menor. Normalmente, com o bloqueio otimista, você encontrará que o valor precisa ser versionado em linha em algum lugar.
Com o MS SQL Server, por exemplo, ele é movido para o TempDB e algo entre 12 e 14 bytes é anexado no final da coluna. Ativar o bloqueio otimista com um nível de isolamento, como Isolamento de instantâneo, pode causar fragmentação e seu fator de preenchimento precisará ser ajustado, pois as linhas agora têm dados adicionais no final, o que pode fazer com que uma página quase cheia cause uma divisão de página, o que diminuirá o seu desempenho. Se o seu TempDB estiver sub otimizado, isso não será tão rápido.
Então eu acho que uma lista de verificação é:
- -Você possui IO / recursos suficientes para lidar com a forma de controle de versão de linha? Caso contrário, você está adicionando sobrecarga. Nesse caso, se você estiver lendo os dados frequentemente enquanto os bloqueia para gravações, notará uma boa melhoria na simultaneidade entre leituras e gravações (embora as gravações ainda bloqueiem gravações, as leituras não bloqueiem mais as gravações e vice-versa)
- -O seu código é suscetível a conflitos ou você experimenta o bloqueio? Se você não estiver enfrentando bloqueios longos ou muitos bloqueios, a sobrecarga adicional do bloqueio otimista não tornaria as coisas mais rápidas, é claro, na maioria dos casos, estamos falando de milissegundos aqui.
- -Se o seu banco de dados for grande (ou em hardware muito limitado) e as páginas de dados estiverem quase cheias, dependendo do RDBMS, você poderá causar grandes divisões de página e fragmentação de dados, portanto, pense em reindexar depois de ativá-lo.
Esses são meus pensamentos sobre o assunto, abertos a ouvir mais da comunidade.