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

問題描述:sql

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

 

問題解決:ide

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

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

下面是具體的解決示例code

 

1.       創建測試環境orm

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個用戶同樣,只是在另外一個鏈接中執行)it

-- 查詢窗口發出下面的查詢語句
BEGIN TRAN
        -- 事務不提交或者回滾, 以保持鎖不釋放
SET ROWCOUNT 20
SELECT *
FROM tb WITH(UPDLOCK, READPAST)
        -- UPDLOCK 讓鎖保留到事務結束, READPAST 跳過已經鎖定的數據

4. 結果class

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

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

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

注: 處理完成後, 刪除記錄, 而後提交事務就能夠了.

相關文章
相關標籤/搜索