J'ai 2 programmes par lots, 1 est un programme qui envoie un courrier électronique et un autre envoie un fax. Ils accèdent tous les deux à une table nommée QUEUE
.Verrouillage dans SQL Server
Dans le programme expéditeur d'email, voici ce qui se passe en relation avec QUEUE
. Pour chaque enregistrement QUEUE
qui satisfait les critères:
- Locks fiche 1 dans
QUEUE
tableau:
select 1 from QUEUE with (UPDLOCK) where id = 1
- processus d'envoi de courrier électronique
- Supprimer fiche 1 dans le tableau QUEUE:
delete from QUEUE where id = 1
- commettras transaction (la transaction n'est pas une validation automatique)
Dans le programme expéditeur de télécopie, des étapes similaires se produisent également, sauf qu'à l'étape 2, nous envoyons des télécopies (bien sûr).
Le problème est que parfois la suppression de QUEUE
rejette une exception qu'elle est verrouillée. De ce fait, la réexpédition des emails/fax arrive. Je suis sûr que le groupe d'enregistrements traités par ces programmes ne se croisent pas.
Il semble que delete tente d'obtenir un verrou de mise à jour (U) sur d'autres enregistrements de la table, bien qu'un seul enregistrement doive être supprimé. Une exception se produit donc lorsque d'autres transactions ont des verrous sur d'autres enregistrements de la même table. Avec cela, j'ai besoin de savoir s'il y a une option pour faire "supprimer" opération ne pas acquérir des verrous sur les enregistrements autres que pour l'enregistrement, il va supprimer. Parce qu'il semble que le problème est avec l'opération "delete" prenant des verrous sur d'autres enregistrements dans la table.
D'ailleurs, voici quelques informations sur la base de données (je ne sais pas s'ils vous aideront):
- Lire Snapshot Engagé est activé
- Etat Isolation photo est affichée sur
voulez-vous dire sur l'instruction delete ou select (je n'ai aucune instruction de mise à jour dans mon pseudo-code)? – rizza
Je pense qu'en utilisant XLOCK dans select et XLOCK, READPAST sur la suppression pourrait fonctionner (testé, la suppression n'est pas bloquée par le verrouillage sur d'autres tables et l'instruction select verrouille l'enregistrement par rapport à une autre instruction essayant de verrouiller l'enregistrement. beaucoup pour votre suggestion. – rizza