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

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

問題:

在用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行),取出後在程序中使用,使用完後刪除掉記錄(不用更新或刪除記錄)。在多用戶操作下(每個用戶采用相同的操作),怎麽保證一個用戶已選取的記錄不被其他...查看完整版>>使用事務與鎖,實現一個用戶取過的數據不被其他用戶取到
 
實現datagrid的foot中增加一個新增數據行,以解決datagrid不能新增數據的問題
以前我從來都沒用過datagrid,因爲覺得這個東東效率比較低,今天要做個比較簡單的東西(字段很少),但需要添加修改刪除,所以就想試一下datagrid,修改、刪除都做完後就剩下添加了,在csdn上查了一下,有不少相關的帖子,但...查看完整版>>實現datagrid的foot中增加一個新增數據行,以解決datagrid不能新增數據的問題
 
使用MD5編碼實現數據庫用戶密碼字段的加密
  1 前言    衆所周知,MD5是目前應用最多的密碼保護方法,該編碼傳說爲不可逆加密編碼<也就是說,永運無法倒算原碼>。 ...查看完整版>>使用MD5編碼實現數據庫用戶密碼字段的加密
 
使用MD5編碼實現數據庫用戶密碼字段的加密
  1 前言  衆所周知,MD5是目前應用最多的密碼保護方法,該編碼傳說爲不可逆加密編碼<也就是說,永運無法倒算原碼>。使用MD5加密用戶的操作密碼,可以有效防止系統維護人員直接進入數據庫時出現系統安全漏洞<...查看完整版>>使用MD5編碼實現數據庫用戶密碼字段的加密
 
實現session登陸時間的驗證,驗證用戶登錄頁面的一個監聽器
1.在login_do.jsp登錄成功的前面加上session.setAttribute("user",admin); 我是在我的驗證Action裏面加上的:Admin admin=dbu.selectAdmin(login.getAdmin_user()); HttpSession session=request.getSession();admin...查看完整版>>實現session登陸時間的驗證,驗證用戶登錄頁面的一個監聽器