Eu tenho um banco de dados multi-sessão. Poucas sessões inserindo muitas linhas no banco de dados. e uma sessão seleciona desta tabela.
Às vezes estou recebendo um impasse na consulta SELECT e não entendo o porquê.
Por exemplo: Suponha que esta tabela
Create Table t1([id] int identity(1,1), [column] varchar(max))
As inserções são assim: (estou fazendo isso a partir de um gatilho 'depois')
Begin Transaction
Insert into t1 WITH (TABLOCKX) ([column]) values ('value 1'), ('value 2') ... ('value N')
Commit Transaction
A seleção fica assim:
Select TOP 10 [id],[column] from t1 order by id
O bloqueio nas inserções destinava-se a manter a sequência de inserções de sessão no banco de dados.
Cada vez eu bloqueio apenas uma tabela em uma transação. Eu tentei recuperar o deadlock com uma sessão inserindo e uma segunda selecionando, mas falhei. Antes de adicionar o TABLOCKX, nunca tive o impasse.
Então minhas perguntas são:
- Como é possível um impasse? (Talvez em uma transação aninhada?)
- Existe uma opção no MSSQL para fazer um bloqueio de gravação de forma a não bloquear os selects?
- Alguma ideia para evitar o impasse? (mas mantenha a sequência de inserção de sessão no banco de dados sem alterações...)
Não posso dizer muito sobre seus impasses sem as consultas ou um gráfico de impasses.
Existe algum motivo para você especificar um bloqueio de tabela exclusivo?
O SQL Server é muito bom em escalar bloqueios de linha ou página para a própria tabela.
Sim, existe, você pode habilitar READ COMMITTED SNAPSHOT ISOLATION LEVEL .
Com este nível de isolamento, você sempre pode ler o que está comprometido. Se outra consulta estiver sendo gravada naquele momento, você verá o instantâneo mais recente do que foi escrito.
Leia a página do MSDN e veja se o RCSIL funcionará para seu aplicativo.