SQL Isolamento

6 respostas
sqlserver
C

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?

6 Respostas

L

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

C

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?

L

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

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

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

Você tem razão.

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

obrigado!

Criado 20 de junho de 2016
Ultima resposta 29 de jun. de 2016
Respostas 6
Participantes 2