問題描述:
用
ADO
訪問數(shù)據(jù)庫,從一個表中取一定的記錄(比如
20
行),取出后在程序中使用,使用完后刪除掉記錄(不用更新或刪除記錄)。在多用戶操作下
(
每個用戶采用相同的操作
)
,怎么保證一個用戶已選取的記錄不被其他用戶選取
?
?
處理這類問題的一般方法是增加一個標(biāo)志列,每個用戶取的記錄設(shè)置一個標(biāo)志,新的用戶只從標(biāo)志為未取的記錄中獲取記錄。
而本文利用事務(wù)與鎖來控制數(shù)據(jù)的處理,不需要增加任何標(biāo)志列
下面是具體的解決示例
?
USE
tempdb
GO
?
CREATE
TABLE dbo.tb(
id intidentity(1, 1),
name
nvarchar
(128))
?
INSERT
tb(name)
SELECT
TOP 100
name
FROM
syscolumns
GO
?
--
查詢窗口發(fā)出下面的查詢語句
BEGIN
TRAN
???????
--
事務(wù)不提交或者回滾
,
以保持鎖不釋放
SET
ROWCOUNT 20
SELECT
*
FROM tb WITH(UPDLOCK, READPAST)
???????
-- UPDLOCK
讓鎖保留到事務(wù)結(jié)束
, READPAST
跳過已經(jīng)鎖定的數(shù)據(jù)
?
3.
??????
模擬第
2
個用戶(語句與第
1
個用戶一樣,只是在另一個連接中執(zhí)行)
--
查詢窗口發(fā)出下面的查詢語句
BEGIN
TRAN
???????
--
事務(wù)不提交或者回滾
,
以保持鎖不釋放
SET
ROWCOUNT 20
SELECT
*
FROM tb WITH(UPDLOCK, READPAST)
???????
-- UPDLOCK
讓鎖保留到事務(wù)結(jié)束
, READPAST
跳過已經(jīng)鎖定的數(shù)據(jù)
?
你會看到
查詢窗口
1
列出了前
20
條數(shù)據(jù)
查詢窗口
1
列出了
21-40
條數(shù)據(jù)
?
這樣就實現(xiàn)了不同的用戶取不同數(shù)據(jù)的需求
.
?
注
:
處理完成后
,
刪除記錄
,
然后提交事務(wù)就可以了
.