有一张表,需要不断的从里面提取一条(入表时间最远)某字段为2的记录出来,然后审核,审核完毕后更新这个表的这个字段为4; 这本来是一个用户的操作,没问题。问题是现在由于 这个表有另个程序在执行insert操作,但这个人处理的速度不够快!就是他查找出了2的记录,必须审核,需要一段时间,而这时间可能又insert新记录来了,  所以打算用多用户处理
怎么可以让不同的用户(他们在不同的机器上使用客户端)来提取出记录,要求每个人提取出来的记录不同, 如下规则:
1:第一个人先提取出最远的一条记录;
2:第N个人提取出最远的一条记录;但是排除前面几个人提取出来的记录
3:处理完毕后,还是更新为4
4:如果client在提取出来,但没有审核更新就异常中断死机等,端开了connection(我用ado编程)sql server自动让该“锁定”的记录可以重新提取原来我是在表加了个字段。 提取让他为1,处理完毕为0
但是,异常死机则该记录死锁掉了!!
我看好象临时表可以在死机断开连接的时候,会自动清除,但不知道如何用
还有其他解决方法么?这个问题1个小时就要解决啊, 相当的紧,各位老大帮忙啊, 解决后我另开帖子给分,谢谢!!!

解决方案 »

  1.   

    回复人: CSDNM(决定不当CSDN经理了) ( ) 信誉:249  2004-04-03 15:53:00  得分:0 
     
     
      一个简单的方法:
    1、加字段,比如为A char null,这里放审核者登录号或者审核者电脑名等可以唯一标志审核者的信息。
    2、添加记录的时候A 为 null
    3、提取的时候,先提取A=自己标志的记录,解决因为死机问题遗留的记录
    4、没有A=自己标志的记录,就提取A is null的记录
    应该不难吧  
     
      

  2.   

    再结合我想到的在表中加个时间字段,表示记录被提取的时间取记录的时候,从时间字段为NULL值,以及与当前时间比较,超过某个时间的记录.
    然后更新被取记录的时间为当前时间.规定记录被审核的时间必须在一个时间段内,超过这个时间段的被自动释放
      

  3.   

    可以协助完成上述处理的函数得到工作站标识可以用:host_id()
    得到工作站名称可以用:host_name()
    得到登陆的用户名可以用:suser_sname()
      

  4.   

    --在表中增加几个字段: 
    read_time --读取记录的时间
    host_name --读取记录的电脑名称
    read_user --读取记录的操作员
    --在 CSDNM 的基础上修改(结合两种方法)后的示例create proc 提取记录
    @read_user char(20)  ---审核者
    as
    declare @id intBEGIN TRANSACTION
    --从本机,本人读取的记录中取
    select top 1 @id=id from tablename with (UPDLOCK) 
    where 某字段=2
    and [host_name]=host_name()
    and read_user=@read_user
    order by time  if @@rowcount=0 --如果没有,从没有被读取的记录中读取
    begin
     select top 1 @id=id from tablename with (UPDLOCK) 
     where 某字段=2
    and(host_name is null
    or read_user is null)
     order by time   if @@rowcount=0 --如果没有,从超时的记录中读取
     begin
     select top 1 @id=id from tablename with (UPDLOCK) 
     where 某字段=2
    and read_time<datediff(hout,-1,getdate())  --假设超时时间为1小时
     order by time  if @@rowcount=0 --无记录退出
    begin
       commit tran
       return 
    end
    end
    end update tablename set 
    read_user=@read_user,
    [host_name]=host_name(),
    read_time=@read_time
    where id=@id
    commit transaction 
    select * from tablename where id=@id
    go
      

  5.   

    谢谢!! 刚我自己用方法测试成功!
    但是还是有个问题
    就是我定义了个变量比如
     @declare @tmp varchar(100)
    select @tmp = '##good'
    create table @tmp (nouse int)最后一行报错误, 我希望能够用变量做创建表的名字,怎么搞?
      

  6.   

    不好意思,我不是故意发这么多帖的, 也浪费我这么多分:)
       原因是我的adsl modem 最近老遭受攻击,即打开网页时候老返回ttl=1路由不可到达错误。 但其他的提交什么却可以! 每次都要重新启动modem(配置好了nat),我发这个帖子的时候就碰到了这个问题!! 我没看到结果,就按了f5,还没看到, 又按了f5,等我反应过来的时候就这样了
    其实我只开了2个帖子,在vb, sqlserver个开了一个, 实在是不好意思!!
      

  7.   

    --因为你是全局的临时表,所以可以这样定义:exec('create table '+@tmp+' (nouse int)')--用全局临时表,用户环境下,控制得不好会引起冲突--建议用下面的方法生成临时表名@declare @tmp sysname
    set @tmp = '[##good'+cast(newid() as varchar(36))+']'
    exec('create table '+@tmp+'(nouse int)')
      

  8.   

    to zjcxc: 
    用你的方法已经搞定了, 下面是我的操作BEGIN TRANSACTION
    declare @id bigint
    select top 1 @id=id from tv where status=2 and object_id('tempdb..##' +cast(id as varchar(100))) is null order by id asc
    exec('create table ##'+@id+'(nouse int)')
    select * from tv where id = @id
    commit transaction 等待审核,到vb用变量记录下那个id来BEGIN TRANSACTION
    update tv set status = 4  where id = vb记录的id变量
    drop table ## + vb记录的id变量
    commit transaction等下给分!
      

  9.   

    免费使用
    免费升级超越水晶报表,是我们的目标
    彻底解除程序员负担,极大提高用户设定灵活性
    LLanV报表工具,经过了10000行以上数据的压力测试,性能优良!其中一部分功能如下:  
    1.支持资料卡(比如:个人简历),表单(比如:销售定单),报表(比如:销售月报表)的预览打印
    2.不用任何设定,就可以默认产生专业的页面
    3.用户可以一次性设定企业标准样式(比如:公司标志,台头)
    4.支持文本,线条,方框,图片,等报表元素
    5.对各报表元素和报表区域等提供丰富的属性
    6.用户可以在运行期间编辑文本,线条,方框,图片,明细列, 操作简单
    7.支持同一列相同数据合并成一个格
    8.可以在运行期间增删,调换明细列
    9.提供多种报表风格
    10.支持页合计,总计
    11.支持的套打报表
    12.支持MIS开发的各种开发工具:如VC、VB、Delphi等
    13.可以直接连接数据库
    14.用户可以把设定后的报表样式保存为报表样式文件
    15.报表头和报表尾均可多于一页
    16.报表样式文件格式完全开放
    17.可以实现中国式复杂报表样式
    18.无须编程请发EMAIL给[email protected]
      

  10.   

    一个简单的方法:
    1、加字段,比如为A char null,这里放审核者登录号或者审核者电脑名等可以唯一标志审核者的信息。
    2、添加记录的时候A 为 null
    3、提取的时候,先提取A=自己标志的记录,解决因为死机问题遗留的记录
    4、没有A=自己标志的记录,就提取A is null的记录
      

  11.   

    刚测试的时候发现的bug修改为BEGIN TRANSACTION
    declare @id bigint
    select top 1 @id=id from tv with(tablockx) where status=2 and object_id('tempdb..##' +cast(id as varchar(100))) is null order by id asc
    if @id is not null exec('create table ##'+@id+'(nouse int)')
    select * from tv where id = @id
    commit transaction 等待审核,到vb用变量记录下那个id来BEGIN TRANSACTION
    update tv with(tablockx) set status = 4  where id = vb记录的id变量
    drop table ## + vb记录的id变量
    commit transaction