使用事務與鎖,實現一個用戶取過的數據不被其他用戶取到(轉鄒健)
問題描述:
用
ADO
訪問數據庫,從一個表中取一定的記錄(比如
20
行),取出后在程序中使用,使用完后刪除掉記錄(不用更新或刪除記錄)。在多用戶操作下
(
每個用戶采用相同的操作
)
,怎么保證一個用戶已選取的記錄不被其他用戶選取
?
問題解決:
處理這類問題的一般方法是增加一個標志列,每個用戶取的記錄設置一個標志,新的用戶只從標志為未取的記錄中獲取記錄。
而本文利用事務與鎖來控制數據的處理,不需要增加任何標志列
下面是具體的解決示例
1.
??????
建立測試環境
USE
tempdb
GO
CREATE
TABLE dbo.tb(
id intidentity(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
條數據
這樣就實現了不同的用戶取不同數據的需求
.
注
:
處理完成后
,
刪除記錄
,
然后提交事務就可以了
.
posted on 2009-04-28 15:55 freebird 閱讀(198) 評論(0) 編輯 收藏 所屬分類: 數據庫