web-dev-qa-db-fra.com

Comment empêcher Deadlock sur les requêtes SELECT?

J'ai une base de données multi-session. Peu de sessions insérant de nombreuses lignes dans la base de données. et une session sélectionne dans ce tableau.

Parfois, je reçois un blocage sur la requête SELECT et je ne comprends pas pourquoi.

Par exemple: Supposons cette table

Create Table t1([id] int identity(1,1), [column] varchar(max))

Les insertions vont comme ceci: (je le fais à partir d'un déclencheur "après")

Begin Transaction
Insert into t1 WITH (TABLOCKX) ([column]) values ('value 1'), ('value 2') ... ('value N')
Commit Transaction

La sélection se présente comme suit:

Select TOP 10 [id],[column] from t1 order by id

Le verrou sur les insertions était destiné à conserver la séquence d'insertions de session dans la base de données.

Chaque fois que je verrouille une seule table dans une transaction. J'ai essayé de récupérer le blocage avec une session insérée et une deuxième sélection mais j'ai échoué. Avant d'avoir ajouté le TABLOCKX, je n'ai jamais eu l'impasse.

Mes questions sont donc:

  1. Comment une impasse est-elle possible? (Peut-être dans une transaction imbriquée?)
  2. Existe-t-il une option dans MSSQL pour effectuer un verrouillage en écriture de manière à ne pas bloquer les sélections?
  3. Une idée pour éviter l'impasse? (mais conservez la séquence d'insertion de session dans la base de données sans modifications ...)
3
SHR

Je ne peux pas en dire beaucoup sur vos blocages sans les requêtes ou un graphique de blocage.
Y a-t-il une raison pour laquelle vous spécifiez un verrou de table exclusif?
SQL Server est très bon pour escalader les verrous d'une ligne ou d'une page à la table elle-même.

Existe-t-il une option dans MSSQL pour effectuer un verrouillage en écriture de manière à ne pas bloquer les sélections?

Oui, vous pouvez activer LIRE LE NIVEAU D'ISOLEMENT D'INSTALLATION COMMIS .
Avec ce niveau d'isolement, vous pouvez toujours lire ce qui est engagé. Si une autre requête est en cours d'écriture à ce moment, vous verrez le dernier instantané de ce qui a été écrit.
Veuillez lire la page MSDN et voir si RCSIL fonctionnera pour votre application.

6
DrTrunks Bell