实现一个用户取过的数据不被其他用户取到

ZDNet软件频道 时间:2009-12-03 作者: | 赛迪网 我要评论()
本文关键词:Server 服务器 SQL
在用ADO访问数据库时,从一个表中取一定的记录(比如20行),取出后在程序中使用,使用完后删除掉记录(不用更新或删除记录)。在本文中将会利用事务与锁来控制数据的处理,不需要增加任何标志列。

  问题:

  在用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条数据。

  此时就实现了不同的用户取不同数据的需求.

  注释::在 处理完成后, 删除记录, 然后提交事务就可以了。 (责任编辑:卢兆林)

Server

服务器

SQL


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134