2008-12-05 9 views
1

J'ai une table avec un index de clé primaire en cluster sur une colonne uniqueidentifier. J'ai une procédure qui exécute les fonctions de Psuedo suivantes:Blocage SQL Server 2005 sur la clé

begin transaction 
read from table 1 
insert into table 2 
update table 1 with pointer to table 2 record 
commit transaction 

Tout cela fonctionne bien jusqu'à ce que la même procédure est exécutée en même temps d'ailleurs. Une fois que cela se produit, l'une des exécutions est bloquée et se termine à chaque fois sur la clé primaire.

Une idée de ce que je peux faire pour éviter cela, à moins de simplement dire "ne pas le faire en même temps"? Les transactions sont actuellement en cours d'exécution au niveau d'isolation READ COMMITTED.

Répondre

2
  1. augmenter le niveau d'isolement de transaction comme eulerfx.myopenid.com insinue.

  2. utilisez sql "mutexes" pour attendre simplement la fin d'une procédure avant d'en exécuter une autre. http://weblogs.sqlteam.com/mladenp/archive/2008/01/08/Application-Locks-or-Mutexes-in-SQL-Server-2005.aspx

  3. utilisez le niveau d'isolement de capture instantanée. En fonction de ce que votre application fait, cela peut fonctionner. Cependant, cela amène d'autres problèmes à la table. http://msdn.microsoft.com/en-us/library/ms189050.aspx

Le numéro 2 requiert plus de changement de code que 1 cependant. mais parfois vous ne pouvez pas simplement augmenter le niveau d'isolation.