实现一个用户取过的数据不被其他用户取到
认识到一个用户获取的数据不会被其他用户获取:
问题:
用ADO访问数据库时,从表中取出一定数量的记录(例如20行),取出后在程序中使用。使用后,删除记录(无需更新或删除记录)。在多用户操作下(每个用户采用相同的操作),如何保证一个用户选择的记录不被其他用户选择?
解决方法:
处理这类问题的一般方法是添加一个标志列,用户拍摄的每条记录都设置一个标志。新用户只能从标记为未使用的记录中获取记录。
在本文中,将使用事务和锁来控制数据处理,而不添加任何标志列。
解决方案的具体示例:
1.建立测试环境
使用tempdb
去
创建表dbo.tb(
id int identity(1,1),
姓名nvarchar(128))
插入tb(名称)
选择100
名字
来自系统列
去吧。模拟第一个用户。
-“查询”窗口发出以下查询语句
开始事务
-不提交或回滚事务以保持锁不被释放。
设置行数20
选择*
FROM TB WITH(up lock,READPAST)
-up lock保持锁定直到事务结束,READPAST跳过锁定的数据
3.模拟第二个用户(该语句与第一个用户相同,只是在另一个连接中执行)
-“查询”窗口发出以下查询语句
开始事务
-不提交或回滚事务以保持锁不被释放。
设置行数20
选择*
FROM TB WITH(up lock,READPAST)
-up lock保持锁定直到事务结束,READPAST跳过锁定的数据
4.结果
如您所见,查询窗口1列出了前20条数据,查询窗口1列出了21-40条数据。
这时候就实现了不同用户获取不同数据的需求。
注意:处理完成后,只需删除记录,然后提交事务。
0条评论