2010-06-07 5 views
2

Je souhaite effectuer une mise à jour, puis sélectionnez le résultat. Je ne veux pas que quelque chose soit en mesure de mettre à jour la ligne que je mets à jour jusqu'à ce que la sélection ait eu lieu. Comment ferais-je cela?SQL Server 2005 et SELECT et UPDATE verrouillés

Mon but est d'incrémenter une valeur d'une ligne et de retourner cette valeur incrémentée. J'ai jusqu'ici trouvé que je me retrouve avec un problème où update (à incrémenter) suivi d'un select dans une situation où deux requêtes se produisent au même moment où les sélections semblent renvoyer le même nombre. Donc je devine que quelque chose comme update> update> select> select est en train de se passer. J'ai manqué étiqueté ceci comme SQL Server 2005. Je travaille réellement avec le serveur 2000. Ainsi la clause de rendement ne fonctionne pas (n'est pas dans cette version).

BEGIN TRANSACTION 
UPDATE Table SET Last=(Last+1) WHERE ID=someid; 
SELECT * FROM Table WHERE ID=someid; 
COMMIT TRANSACTION 
+0

Vous ne faites certainement pas 'select> update> select' avec le premier select qui obtient la valeur utilisée dans la mise à jour? –

+0

J'ajoute le débogage pour trouver les valeurs exactes, tout ce que je sais c'est qu'elles sont identiques. – aepheus

+0

Pouvez-vous poster le code? –

Répondre

3
BEGIN TRAN 
UPDATE ... 
SELECT... 
COMMIT 

devrait le faire même au niveau d'isolation des transactions par défaut de lecture validée.

Vous pouvez également utiliser la clause OUTPUT pour obtenir la ligne directement après la mise à jour. Exemple de ceci

UPDATE <YourTable> 
    SET ... 
OUTPUT INSERTED.* 
WHERE ... 
+0

Merci, Begin/Commit est exactement ce que je cherchais. – aepheus

+0

Juste pour l'exhaustivité je devrais probablement mentionner que si votre clause where n'est pas sur quelque chose garanti d'être unique et que vous voulez être sûr que votre sélection ne retourne aucune ligne supplémentaire insérée après la mise à jour qui correspond à la clause where utiliser le niveau d'isolation SERIALIZABLE. –

+0

Cela n'a pas semblé fonctionner comme je m'y attendais. Les essais de ce matin semblent montrer qu'il y a toujours un problème avec la mise à jour et la sélection. Il semble que deux appels "update then select" peuvent arriver et se produire quelque chose comme ceci: update> update> select> select. Où les deux sélections finissent avec la même valeur, quand ils devraient avoir des valeurs différentes. note: tout est sur la même ligne. – aepheus