Tabela1
Chave1 (int) not null IDENTITY
Valor1 (varchar(10)) not null
Chave2 (int) IDENTITY
Valor2 (varchar(10)) not null
Chave1 (int) null, FK para Tabela1
Feito isso, vamos incluir 10 registros em cada tabela, mantendo a Chave1 em Tabela2 sempre nulo.
Chave1 | Valor1 |
1 | VT1 - 1 |
2 | VT1 - 2 |
3 | VT1 - 3 |
4 | VT1 - 4 |
5 | VT1 - 5 |
6 | VT1 - 6 |
7 | VT1 - 7 |
8 | VT1 - 8 |
9 | VT1 - 9 |
10 | VT1 - 10 |
Tabela 1: Exemplo da tabela 1
Chave2 | Valor2 | Chave1 |
1 | VT2 - 1 | NULL |
2 | VT2 - 2 | NULL |
3 | VT2 - 3 | NULL |
4 | VT2 - 4 | NULL |
5 | VT2 - 5 | NULL |
6 | VT2 - 6 | NULL |
7 | VT2 - 7 | NULL |
8 | VT2 - 8 | NULL |
9 | VT2 - 9 | NULL |
10 | VT2 - 10 | NULL |
Tabela 2: Exemplo da tabela 2
Executar os comandos em janelas distintas:
1. Janela 1
insert into Tabela2 with (rowlock) (valor2) values ('NT2 - 1')
begin tran;
delete from Tabela1 with (rowlock) where chave1 = 5
3. Aqui o problema já ocorre! A Janela 2 fica aguardando a execução da Janela 1.
4. Libere a Janela 1 com o comando: rollback tran;
5. Faça o mesmo na Janela 2.
O esperado seria locar apenas um registro no insert. Esse problema só pode ser resolvido se for colocado um índice na Tabela2 para a coluna Chave1.