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?
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?
L
LeandroMartins
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.
C
CaitanoDiniz
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
L
LeandroMartins
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.
C
CaitanoDiniz
Você tem razão.
Utilizei método SERIALIZABLE com um implementação correta no código e funcionou!