实现一个用户取过的数据不被其他用户取到
生活随笔
收集整理的這篇文章主要介紹了
实现一个用户取过的数据不被其他用户取到
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
實(shí)現(xiàn)一個(gè)用戶取過的數(shù)據(jù)不被其他用戶取到:
2.模擬第1個(gè)用戶
3. 模擬第2個(gè)用戶(語(yǔ)句與第1個(gè)用戶一樣,只是在另一個(gè)連接中執(zhí)行)
4.結(jié)果
問題:
在用ADO訪問數(shù)據(jù)庫(kù)時(shí),從一個(gè)表中取一定的記錄(比如20行),取出后在程序中使用,使用完后刪除掉記錄(不用更新或刪除記錄)。在多用戶操作下(每個(gè)用戶采用相同的操作),如何保證一個(gè)用戶已選取的記錄不被其他用戶選取?
解決方法:
處理此類問題的一般方法是增加一個(gè)標(biāo)志列,每個(gè)用戶取的記錄設(shè)置一個(gè)標(biāo)志,新的用戶只從標(biāo)志為未取的記錄中獲取記錄。
在本文中將會(huì)利用事務(wù)與鎖來控制數(shù)據(jù)的處理,不需要增加任何標(biāo)志列。
解決的具體示例:
1.建立測(cè)試環(huán)境
| USE tempdbGOCREATE TABLE dbo.tb(id int identity(1, 1), name nvarchar(128))INSERT tb(name)SELECT TOP 100 nameFROM syscolumnsGO |
| -- 查詢窗口發(fā)出下面的查詢語(yǔ)句BEGIN TRAN-- 事務(wù)不提交或者回滾, 以保持鎖不釋放SET ROWCOUNT 20SELECT * FROM tb WITH(UPDLOCK, READPAST)-- UPDLOCK 讓鎖保留到事務(wù)結(jié)束, READPAST 跳過已經(jīng)鎖定的數(shù)據(jù) |
3. 模擬第2個(gè)用戶(語(yǔ)句與第1個(gè)用戶一樣,只是在另一個(gè)連接中執(zhí)行)
| -- 查詢窗口發(fā)出下面的查詢語(yǔ)句BEGIN TRAN-- 事務(wù)不提交或者回滾, 以保持鎖不釋放SET ROWCOUNT 20SELECT * FROM tb WITH(UPDLOCK, READPAST)-- UPDLOCK 讓鎖保留到事務(wù)結(jié)束, READPAST 跳過已經(jīng)鎖定的數(shù)據(jù) |
4.結(jié)果
大家可以看到:查詢窗口1列出了前20條數(shù)據(jù),查詢窗口1列出了21-40條數(shù)據(jù)。
此時(shí)就實(shí)現(xiàn)了不同的用戶取不同數(shù)據(jù)的需求.
注釋::在 處理完成后, 刪除記錄, 然后提交事務(wù)就可以了。
轉(zhuǎn)載于:https://www.cnblogs.com/gooddasenlin/archive/2011/05/27/2059684.html
總結(jié)
以上是生活随笔為你收集整理的实现一个用户取过的数据不被其他用户取到的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu Server 13.04安
- 下一篇: 滚动条插件nicescroll的使用