問題描述: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條數據
這樣就實現了不一樣的用戶取不一樣數據的需求.
注: 處理完成後, 刪除記錄, 而後提交事務就能夠了.