2008-09-05 3 views
1

Mon travail a une application financière, écrite en VB.NET avec SQL, sur laquelle plusieurs utilisateurs peuvent travailler en même temps. À un certain moment, un utilisateur peut décider de publier le lot d'entrées sur lequel il travaille (et peut-être d'autres personnes).Comment verrouiller certaines lignes SQL lors de l'exécution d'un processus sur celles-ci?

De toute évidence, je ne veux plus d'autres utilisateurs à ajouter , modifier ou supprimer entrées dans ce lot après le processus post a été lancé.

J'ai déjà vu que je peux verrouiller toutes les données en ouvrant la transaction SQL au moment où le processus Post commence, mais le processus peut être assez long et je préférerais ne pas avoir la transaction ouverte pendant plusieurs minutes, il pourrait prendre pour compléter la fonction.

Existe-t-il un moyen de verrouiller uniquement les enregistrements dont je sais qu'ils doivent être exploités à partir du code VB.NET?

Répondre

0

ajouter

with (rowlock) 

à votre requête SQL

SQL Server Performance article

EDIT: ok, j'ai mal compris la question. Ce que vous voulez, c'est l'isolation des transactions. +1 à Joel :)

2

Si vous utilisez Oracle, Sélectionnez pour la mise à jour sur les lignes que vous verrouillez.

est ici un exemple

SELECT address1 , city, country 
FROM location 
FOR UPDATE; 
1

Vous voulez probablement définir un niveau d'isolement pour l'ensemble de la transaction plutôt que d'utiliser avec (tolet) sur des tables spécifiques.

Regardez cette page:
http://msdn.microsoft.com/en-us/library/ms173763.aspx

Plus précisément, la recherche en son sein pour « verrou de ligne », et je pense que vous constaterez que READ COMMITTED ou lire répétables ce que vous voulez. READ COMMITTED est la valeur par défaut de SQL Server. Si READ COMMITTED ne vous semble pas assez fort, alors allez REPEATABLE READ.

Mise à jour: Après avoir lu l'un de vos messages de suivi, vous voulez certainement lire de façon répétable. Cela conservera le verrou jusqu'à ce que vous validiez ou annuliez la transaction.

0

envelopper dans un tran utiliser un holdlock + UPDLOCK dans la sélection

exemple

begin tran 
select * from 
SomeTable (holdlock,updlock) 
where .... 


processing here 

commit 
Questions connexes