我在编一个vb2005+sql2000的c/s 工资系统, 
我想实现的功能是分场的一个办事员将自己分场的数据利用dataset中的数据update到服务器数据库的工资库总表时,判断一下是否有别的分场的办事员,也在同时进行相同的update操作,如果有,为避免出现错误,等待别人的update操作完成,在进行自己的update操作. 
请高手指点,我该如何实现.

解决方案 »

  1.   

    update的时候锁表,成功后解除,让别人去更新表.
      

  2.   

    1 如何锁一个表的某一行
    /*
            测试环境:windows 2K server + Mssql 2000
            所有功能都进行测试过,并有相应的结果集,如果有什么疑义在论坛跟帖
            关于版权的说明:部分资料来自互联网,如有不当请联系版主,版主会在第一时间处理。
            功能:sql遍历文件夹下的文本文件名,当然你修改部分代码后可以完成各种文件的列表。
    */
    A 连接中执行SET TRANSACTION ISOLATION LEVEL REPEATABLE READbegin transelect * from tablename with (rowlock) where id=3waitfor delay '00:00:05'commit tranB连接中如果执行update tablename set colname='10' where id=3 --则要等待5秒update tablename set colname='10' where id<>3 --可立即执行2 锁定数据库的一个表SELECT * FROM table WITH (HOLDLOCK) 
    注意: 锁定数据库的一个表的区别SELECT * FROM table WITH (HOLDLOCK) 
    其他事务可以读取表,但不能更新删除SELECT * FROM table WITH (TABLOCKX) 
    其他事务不能读取表,更新和删除
      

  3.   

    锁定记录,只允许单用户修改的例子create table #锁表(编号 int)--代码:
    if exists(select 1 from 编号='你的编号') 
      returninsert #锁表 values('你的编号').....你处理的代码delete #锁表 where 编号='你的编号'
    --------------------------------------
    --为了防止死锁,建议加时间:create table #锁表(编号 int,时间 datetime)--代码:
    if exists(select 1 from 编号='你的编号' and datediff(ss,时间,getdate())<5  --如果锁的时候超过5秒,则是处理超时

      returndelete from #锁表
    insert #锁表 values('你的编号',getdate()).....你处理的代码delete #锁表 where 编号='你的编号'
    ---------------------------------------
    --锁定记录,只允许单用户修改的例子:--创建测试环境
    --创建测试表--部门表
    create table 部门(departmentid int,name varchar(10))--记录锁定表
    create table lock(departmentid int,dt datetime)go
    --因为函数中不可以用getdate,所以用个视图,得到当前时间
    create view v_getdate as select dt=getdate()
    go
    --创建自定义函数,判断记录是否锁定
    create function f_chk(@departmentid int)
    returns bit
    as
    begin
    declare @re bit,@dt datetime
    select @dt=dt from v_getdate
    if exists(select 1 from lock where departmentid=@departmentid
    and datediff(ss,dt,@dt)<5)
    set @re=1
    else
    set @re=0
    return(@re)
    end
    go--数据处理测试
    if dbo.f_chk(3)=1
    print '记录被锁定'
    else
    begin
    begin tran
    insert into lock values(3,getdate())
    update 部门 set name='A' where departmentid=3
    delete from lock where departmentid=3
    commit tran
    end--删除测试环境
    drop table 部门
    drop view v_getdate
    drop function f_chk
      

  4.   

    sql server 2000 中在默认的隔离级别 read committed下就可以满足楼主的需求了。一般主流的数据库产品在事务管理上都比较成熟
      

  5.   


    update 同一条记录,sql server默认情况下,自己就会等待上一个独占锁释放,不用你操心。
      

  6.   

    通过sysprocesses\syslockinfo--可以查出来
      

  7.   

    在一个事物中update能解决你的问题