使用事務與鎖,實現一個用戶取過的數據不被其他用戶取到

問題描述:

ADO訪問數據庫,從一個表中取一定的記錄(比如20行),取出後在程序中使用,使用完後刪除掉記錄(不用更新或刪除記錄)。在多用戶操作下(每個用戶採用相同的操作),怎麼保證一個用戶已選取的記錄不被其他用戶選取?

 

問題解決:

處理這類問題的一般方法是增加一個標誌列,每個用戶取的記錄設置一個標誌,新的用戶只從標誌爲未取的記錄中獲取記錄。

而本文利用事務與鎖來控制數據的處理,不需要增加任何標誌列

下面是具體的解決示例

 

1.       建立測試環境

USE tempdb

GO

 

CREATE TABLE dbo.tb(

id int identity(1, 1),

name nvarchar(128))

 

INSERT tb(name)

SELECT TOP 100

name

FROM syscolumns

GO

 

2.       模擬第1個用戶

-- 查詢窗口發出下面的查詢語句

BEGIN TRAN

        -- 事務不提交或者回滾, 以保持鎖不釋放

SET ROWCOUNT 20

SELECT *

FROM tb WITH(UPDLOCK, READPAST)

        -- UPDLOCK 讓鎖保留到事務結束, READPAST 跳過已經鎖定的數據

 

3.       模擬第2個用戶(語句與第1個用戶一樣,只是在另一個連接中執行)

-- 查詢窗口發出下面的查詢語句

BEGIN TRAN

        -- 事務不提交或者回滾, 以保持鎖不釋放

SET ROWCOUNT 20

SELECT *

FROM tb WITH(UPDLOCK, READPAST)

        -- UPDLOCK 讓鎖保留到事務結束, READPAST 跳過已經鎖定的數據

 

4.       結果

你會看到

查詢窗口1列出了前20條數據

查詢窗口1列出了21-40條數據

 

這樣就實現了不同的用戶取不同數據的需求.

 

: 處理完成後, 刪除記錄, 然後提交事務就可以了.

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章