| 導購 | 订阅 | 在线投稿
分享
 
 
 

實現一個用戶取過的數據不被其他用戶取到

來源:互聯網  2008-06-01 02:15:20  評論

實現一個用戶取過的數據不被其他用戶取到:

問題:

在用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條數據。

此時就實現了不同的用戶取不同數據的需求.

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

實現一個用戶取過的數據不被其他用戶取到: 問題: 在用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條數據。 此時就實現了不同的用戶取不同數據的需求. 注釋::在 處理完成後, 刪除記錄, 然後提交事務就可以了。
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有