当前位置:编程学习 > C#/ASP.NET >>

怎样从数据库提取N条不重复的随机记录

有数据表 Cards

id int identity(1,1),--自增列
card varchar(30) not null,--卡号码(唯一)
status int ,   --标识字段,1 已被提取过 ;0 未被提取过
sno varchar(50),--操作流水号,


有多个用户从表中提取卡号使用
怎样能从数据库中随机提取不多不少N个未被提取过的卡号,并同时修改标识列,保证数据不能被其他重复提取 --------------------编程问答--------------------
select distinct card from Cards order bu Newid()
--------------------编程问答-------------------- 同上 . --------------------编程问答--------------------

   select * from table order by dbms_random.value 


oracle 的 --------------------编程问答--------------------  不是这个意思a ---
多个用户同时操作Cards表--,提取卡号

1一个卡号只能被提取一次
2当前用户提取正好N条
3修改状态标识status --------------------编程问答-------------------- 补充
  

   select * from
      (select * from  table order by dbms_random.value) s where rownum = N
  
--------------------编程问答-------------------- 不是一个操作--

多个用户同时在表中提取数据使用,
1如果先select top n card from cards where status =0 再 update orders set  status=1 where cards=---
我select 的卡号,在这期间可能被其他用户提取了--这样卡号就被重复使用了
我的想法是该先update status=1 , sno=---然后 select card from cards where sno=--

2还有一个N条记录的问题,select top n card from --不能保证记录正好N条 --------------------编程问答-------------------- 好像是个买车票问题,关注ING~ --------------------编程问答-------------------- 楼上朋友说的对啊,就是这个意思啊--谁来救救我啊!!!! --------------------编程问答-------------------- 表里加个字段表示状态
被提取过了状态改变
用事务来做
先提取这个卡号,再把这个卡号状态改变,前面提取时加上状态选择的条件 --------------------编程问答-------------------- --------------------编程问答-------------------- 同一个卡号,第二个人能不能看到?
如果不能的话就是说在slect之前对这个卡号有所标记。 --------------------编程问答-------------------- 好像可以弄个加锁的字段。。。。。那个字段绑定了当前用户操作,其他用户不可以动。。。 --------------------编程问答-------------------- 还是不行啊--这就是个数据并发的问题
这是多人访问数据库一起的数据并发问题--
打比方一个人a要买5张北京-上海的火车票
A:先问问有5张票吗:
售货员查:还有,可以买了
A:好,买
售货员查:不要意思票刚刚被买别人走了,只有2张了
要买5张,只剩2张也不行啊--A的本次买票行动失败了
 
上面那种做法先我select 提取再修改状态,有个问题可能这个过程中--别人也提取这些数据呢,同条记录是可以同时被多个用户select 的


--------------------编程问答-------------------- 用READPAST +锁,同时用事务操作。看下面的例子
BEGIN TRANSACTION 
UPDATE TOP(1) SalesHistory 
SET SalePrice = SalePrice + 1 

因为我没有提交或回滚这个事务,所以添加在更新记录上的锁仍旧有效。在一个新的查询编辑窗口中,运行下面的脚本,该脚本对SalesHistory数据表使用READPAST统计表中的记录数。 

SELECT COUNT(*) 
FROM SalesHistory WITH(READPAST) 

最初SalesHistory数据表中包含300条记录,UPDATE语句正锁定表中一条记录,所以上面使用READPAST的脚本返回结果为299条记录,这说明我要更新的记录被锁定,所以被REASPAST提示忽略。本篇文章来源于:开发学院 http://edu.codepub.com   原文链接:http://edu.codepub.com/2009/0803/12009.php --------------------编程问答-------------------- 学习中 --------------------编程问答-------------------- select top 10 card from Cards order by Newid() --------------------编程问答--------------------
引用 14 楼 yan267 的回复:
用READPAST +锁,同时用事务操作。看下面的例子
BEGIN TRANSACTION 
UPDATE TOP(1) SalesHistory 
SET SalePrice = SalePrice + 1 

因为我没有提交或回滚这个事务,所以添加在更新记录上的锁仍旧有效。在一个新的查询编辑窗口中,运行下面的脚本,该脚本对SalesHistory数据表使用READPAST统计表中的……

就应该用事务做吧,要不然不好同时查询修改 --------------------编程问答-------------------- 用事务来操作状态位。至少铁路售票是这样来做的。 --------------------编程问答-------------------- 读锁定应该可以吧。
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,