Temos um banco de dados em execução no SQL Server 2016 SP1 Enterprise e no qual Allow Snapshot Isolation
está habilitado. Nesse cenário, os leitores não bloqueiam os escritores e os escritores não bloqueiam os leitores.
Hoje vimos que uma SELECT
-query estava bloqueando uma UPDATE
-query. Estas são as consultas em questão:
Primeira consulta:
IF @@TRANCOUNT = 0 SET TRANSACTION ISOLATION LEVEL SNAPSHOT
SELECT TOP 10 Field1, Field2, Field3 FROM [dbo].[TABLE1]
WHERE ([Field1] = @SV1 AND (1=1))
ORDER BY A.[Field1] ASC,A.[Field2] ASC
OPTION (KEEP PLAN, KEEPFIXED PLAN, LOOP JOIN)
Segunda consulta:
UPDATE [dbo].[Table1] SET [Field4]= @V128, [Field5]= @V140, [Field6]= @V141 WHERE [Field3] = @ID0
Se entender o versionamento corretamente, uma SELECT
-query não usa nenhum bloqueio porque funciona em um instantâneo dos dados (tirado no início da transação). Como é possível que a SELECT
-query bloqueie o UPDATE
?
se @@trancount <> 0, esse SELECT será executado com o nível de isolamento da transação atual. O que (a menos que já seja SNAPSHOT) exigirá bloqueios S para leitura de dados.
Se você quiser que todos os SELECTS usando o nível de isolamento READ COMMITTED padrão usem controle de versão de linha em vez de bloqueios S, defina READ COMMITTED SNAPSHOT no banco de dados.