本文使用一個執行個體來說明如何使用樂觀鎖定和悲觀鎖定來解決多使用者並發的環境裡,其他使用者已經把你要修改的資料進行了修改而造成資料的不一致的問題。
在實際的多使用者並發訪問的生產環境裡邊,我們經常要儘可能的保持資料的一致性。而其中最典型的例子就是我們從表裡邊讀取資料,檢查驗證後對資料進行修改,然後寫回到資料庫中。在讀取和寫入的過程中,如果在多使用者並發的環境裡邊,其他使用者已經把你要修改的資料進行了修改是非常有可能發生的情況,這樣就造成了資料的不一致性。解決這樣的辦法,SQL SERVER提出了樂觀鎖定和悲觀鎖定的概念,下邊我以一個執行個體來說明如何使用樂觀鎖定和悲觀鎖定來解決這樣的問題。
/*建立測試表:Card,代表一個真實的卡庫,供使用者註冊。使用者要從裡邊選出一個未使用的卡,也就是F_Flag=0的卡,給使用者註冊:更新F_Name,F_Time,F_Flag欄位。如果出現兩個使用者同時更新一張卡的情況,是不能容忍的,也就是我們所說的資料不一致行。*/
create table Card(F_CardNO varchar(20),F_Name varchar(20),F_Flag bit,F_Time datetime)
Go
insert Card(F_CardNo,F_Flag) select '1111-1111',0
insert Card(F_CardNo,F_Flag) select '1111-1112',0
insert Card(F_CardNo,F_Flag) select '1111-1113',0
insert Card(F_CardNo,F_Flag) select '1111-1114',0
insert Card(F_CardNo,F_Flag) select '1111-1115',0
insert Card(F_CardNo,F_Flag) select '1111-1116',0
insert Card(F_CardNo,F_Flag) select '1111-1117',0
insert Card(F_CardNo,F_Flag) select '1111-1118',0
insert Card(F_CardNo,F_Flag) select '1111-1119',0
insert Card(F_CardNo,F_Flag) select '1111-1110',0
Go
-- 下邊是我們經常使用的更新方案如下: