Bonjour,

j'ai un problème de deadlock sur 2 deletes simultanés d'enregistrements dans une table B dont dépend une table C.
Je travaille sur une base de données SQL server 2005. Je suis en niveau d'isolation READ_COMMITED.

Voici le modèle des tables :
Table A, dont dépend Table B, dont dépend Table C. Pas de delete cascade sur toutes ces tables. Colonne idA indexée dans les 3 tables.

On veut supprimer dans un thread 1 les enregistrements des tables B et C d’idA = 1111.
On veut supprimer dans un thread 2 les enregistrements des tables B et C d’idA = 2222.

Voici les traces de SQL Server profiler

Begin transaction T1
Delete from C with (rowlock) where idA=1111
Delete from B with (rowlock) where idA=1111

Begin transaction T2
Delete from C with (rowlock) where idA=2222
Delete from B with (rowlock) where idA=2222
Deadlock
Rollback transaction T2

Commit transaction T1

Ayant précisé un rowlock, je ne comprend pas pourquoi j'ai un deadlock sur la table B.

En analysant la trace du profiler j'ai vu que le delete from B fait 44000 reads, alors qu'il n'y a que 3 enregistrements à supprimer dans B et 14 dans C.
Il ne semble donc pas utiliser les index sur le delete ?

J'ai essayé de lui préciser d'utiliser l'index
delete from B with (index (PK_B)) where idA=1111
mais j'ai une erreur de syntaxe : Les indicateurs d'index ne sont autorisés que dans une clause FROM.

Est-ce que quelqu'un a déjà rencontré ce type de problème ?
Est-ce qu'un delete cascade pourrait le résoudre ?

D'avance merci pour vos réponses.