2008-11-24 7 views
4

Le scénario suivant est-il possible dans SQL Server à l'aide d'une seule connexion active?Mise à jour sans verrouillage dans une transaction

Dans une transaction READCOMMITED, j'ai besoin de mettre à jour une table sans la verrouiller. Par exemple, chaque fois que j'exécute une déclaration, j'augmente un champ dans cette table. Cette opération n'a pas besoin d'être annulée en cas d'échec de la transaction. En outre, cette mise à jour ne doit pas bloquer les autres utilisateurs simultanés qui tentent de mettre à jour la même position.

Répondre

1

Vous ne pouvez pas effectuer une mise à jour sans mettre des verrous sur la table. Cela permet au niveau d'isolation de transaction des AUTRES transactions de contrôler si elles peuvent "voir" les modifications apportées dans la mise à jour. Vous pouvez modifier le niveau d'isolement de la transaction pour la mise à jour, mais cela n'affecte que la session de mise à jour (où vous l'avez définie) pour contrôler si la mise à jour peut "voir" les modifications effectuées dans d'autres sessions ...

Si vous voulez Pour être en mesure de voir ce que vous faites dans cette mise à jour, comme si elle n'était pas verrouillée, vous devez modifier le niveau d'isolation des transactions sur ces autres tx pour Read Uncommited. (Attention à ce sujet ... Ce niveau d'isolement peut autoriser de nombreuses incohérences dans votre base de données.)

1

Vous ne pouvez pas verrouiller une table pendant une écriture.

Voulez-vous dire que vous voulez écrire dans une table, mais que le verrou exclusif non persiste jusqu'à validation/annulation? Si tel est le cas, placez la ou les valeurs dont vous avez besoin dans une variable de table (qui n'est pas affectée par l'annulation/la validation) et reportez l'écriture après la transaction principale. Effectuez ensuite une seule mise à jour pour extraire la valeur de la variable de table.

Edit: SQL 2008 workaround, avec d'autres idées plus tard

+0

tx, les transactions autonomes sont vraiment intéressantes. –

+0

En ce qui concerne votre solution pour le mettre sur la variable table, Disons que j'ai un long SP qui insère dans une table et obtient la valeur IDENTITY pour cet insert et maintenant je fais d'autres choses en fonction de cette valeur .... Je le fais ? Je ne pense pas que je serai capable de le faire. (J'ai aussi un long sp qui fait beaucoup de CPU et beaucoup d'insertions basées sur des identités, mais je ne veux pas bloquer tout le système) ... Est-ce que votre solution peut le résoudre? –

Questions connexes