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