2012-09-10 76 views
2

我想鎖定一條記錄以防止任何人在我使用時更新。如何鎖定自己鎖定的記錄和更新記錄。 (Asp.Net和ADS)

但鎖記錄後,連自己也無法更新鎖定的記錄:(

難道我之前,我更新的記錄解鎖?

或者是有沒有辦法更新,我鎖定了記錄我

string query = "SELECT * FROM table1"; 
AdsCommand cmd = conn.CreateCommand(); 
cmd.CommandText = query; 

AdsExtendedReader reader = cmd.ExecuteExtendedReader(); 
reader.Read(); 

int recordNo = reader.RecordNumber; 
reader.LockRecord(recordNo); 

// do something with table1 record 
// while doing something, I need to lock the record before I update record 

AdsCommand cm = new AdsCommand("UPDATE table1 SET field1 = 'UPDATED'", conn); 
cm.ExecuteNonQuery(); 

回答

4

不可能共享被打開「直接」(而不是通過SQL操作)和SQL操作或其它表實例的表之間的記錄鎖定。

一種可能性是在獲得鎖定之後通過擴展閱讀器進行更新。您可以使用SetStringSetValue

reader.SetString(colNumber, 'UPDATED'); 

另一種可能是更新交易記錄。然後該記錄將被該用戶保持鎖定,直到事務提交。例如,你可以使用類似下面的語句是「無操作」(假設沒有觸發器都參與)來鎖定交易記錄,而無需修改數據:

UPDATE table1 set field1 = field1 WHERE pk=1; 
+0

真棒!第二種方式非常完美!非常感謝你! –

0

不能鎖定,然後使用不同的SQL語句進行更新;?打開的查詢,因爲你鎖定表與第一個不能發生的另一個實例只是不不用擔心鎖定它,然後運行你的UPDATE聲明。 ADS將自動鎖定記錄,進行更改併爲您解鎖。

// Note I added a WHERE statement with a dummy value for `finvno`, since your 
// select didn't provide one 
AdsCommand cm = new AdsCommand("UPDATE table1 SET field1 = 'UPDATED' WHERE finvno = 'SomeInvNo'", conn); 
cm.ExecuteNonQuery();