問題:
在用ADO訪問數據庫時,從一個表中取一定的記錄(比如20行),取出后在程序中使用,使用完后刪除掉記錄(不用更新或刪除記錄)。在多用戶操作下(每個用戶采用相同的操作),如何保證一個用戶已選取的記錄不被其他用戶選取?
解決方法:
處理此類問題的一般方法是增加一個標志列,每個用戶取的記錄設置一個標志,新的用戶只從標志為未取的記錄中獲取記錄。
在本文中將會利用事務與鎖來控制數據的處理,不需要增加任何標志列。
解決的具體示例:
1.建立測試環境
USE tempdbGOCREATE TABLE dbo.tb(id int identity(1, 1), name nvarchar(128))INSERT tb(name)SELECT TOP 100 nameFROM syscolumnsGO |
-- 查詢窗口發出下面的查詢語句BEGIN TRAN-- 事務不提交或者回滾, 以保持鎖不釋放SET ROWCOUNT 20SELECT * FROM tb WITH(UPDLOCK, READPAST)-- UPDLOCK 讓鎖保留到事務結束, READPAST 跳過已經鎖定的數據 |
3. 模擬第2個用戶(語句與第1個用戶一樣,只是在另一個連接中執行)
-- 查詢窗口發出下面的查詢語句BEGIN TRAN-- 事務不提交或者回滾, 以保持鎖不釋放SET ROWCOUNT 20SELECT * FROM tb WITH(UPDLOCK, READPAST)-- UPDLOCK 讓鎖保留到事務結束, READPAST 跳過已經鎖定的數據 |
4.結果
大家可以看到:查詢窗口1列出了前20條數據,查詢窗口1列出了21-40條數據。
此時就實現了不同的用戶取不同數據的需求.
注釋::在 處理完成后, 刪除記錄, 然后提交事務就可以了。