SQL Isolamento

Estou com um problema de isolamento no SQL Server. Tenho uma tabela que faço um select pelo menor id e marca como locado na banco de dados o mesmo lote:

update tab set locado = 'x' where lote in (select top 1 lote from tab where locado <> 'x' order by id)

id desc lote locado
1 A LOTE001 null
2 B LOTE001 null
3 C LOTE001 null
4 D LOTE002 null
5 E LOTE003 null
6 F LOTE004 null

Estou tendo problemas que a aplicação está locando os mesmos casos para pessoas diferentes.

Como eu posso resolver esse problema de isolamento?

Escolha um nível de isolamento de transação, inicie e finalize para cada comando. Verifique aqui como fazer: https://msdn.microsoft.com/pt-br/library/ms173763.aspx

Obrigado!

Eu implementei o método SERIALIZABLE com transaction commit. Resolveu o problema mas o espaço do banco de dados aumentou muito… Isso está acontecendo por conta dos commits com updates? ou por que o método SERIALIZABLE copia dados para tabela tempdb?

Aí eu já não tenho certeza, mas faz sentido. Pelo que li, vale a pena você utilizar o REPEATABLE READ. Deve ser melhor pra você. Não sei se você leu, mas o SERIALIZABLE é bem pesado e deve ser usado só em último caso.

Obrigado mais uma vez!

Você já utilizou SNAPSHOT? acho que vou fazer um teste com essa opção.

Pelo que eu entendi ele evita LOCK e WAIT? mas ainda não sei se vai consumir muita memória do tempdb

Cara, acho com SNAPSHOT vc corre o risco de não resolver o primeiro problema. Se duas transações se iniciarem e lerem o mesmo resultado do select, ambas podem atualizar o registro. Nesse caso, acho que o lock é inevitável.

Você tem razão.

Utilizei método SERIALIZABLE com um implementação correta no código e funcionou!

obrigado!