我猜,A请求写操作的话,直接上锁,其他后需请求的人(B)只能读不能写。A写完释放锁,其他人可写。

解决方案 »

  1.   

    你这样处理,人都不知道以谁的单据为准,电脑更不知道了。尤其是当A改了一半,B才进入,B获得的数据本身就是错的,你还改什么啊。
    1楼的方法妥妥的。
      

  2.   

    锁机制应交由数据库处理,当操作数据库时,数据库系统会自动上锁,如果人为上锁,会有误锁、死锁的风险。对于你的问题,涉及脏读,分2种情况:
    1、如果每个用户的更新是独立的,而你的目标是只要最后一次(最新)更新的结果,你可以不用处理;
    2、如果每个用户的更新是相互依赖的,或者只允许一个用户更新,你可以在表上增加一个bit类型的字段标识这一行记录能不能被访问,或者限制访问,用户只能修改自己建立的记录,或者在更新前重新查询,看记录有没有被其他用户修改。
    总之保持数据一致应在数据结构、程序逻辑上保证,锁的工作由数据库系统处理。
      

  3.   


    楼主稍安勿躁
    看不到想要的也没必要不爽, 要得到正确答案总得有个交流过程数据库锁是实现你要求的一个处理办法,比较常用和简单.
    再一种就是把查询的结果存一份, 更新时查询条件把重要字段都where了如果不考虑数据库加锁, 可以在update时增加判断条件, 比如
    执行select * from Ta where id = 1得到以下值
    colA='AA', modifyVersion='1', id = 1(modifyVersion是一个改动的版本号, 每次更新+1)
    更新时这么写, 就避免了重复更新
    update colA = 'A', modifyTime = '2' from Ta where ID = 1 and modifyTime = '1'
      

  4.   

    之前有看到过,说是ADO是先将修改前的记录保存,在修改完后,提交时,先判断数据库中的记录与之前保存的记录是否一致,如果不一致,则表示有人改过了,提示错误。
      

  5.   

    如果要避免脏读后的修改,设数据 d = 3
    用户a读取
    用户b读取
    用户a修改为4,提交
    用户b修改为5,提交这是b读的数据是脏数据,,如果要避免脏读,我提供一个思路:
    针对一笔单据,提供一个GUID或时间戳,读取的时候,时间戳也读取过来了,修改完提交的时候,先做数据库事务锁定,然后读取最新的时间戳,比对先前读取的时间戳,若相同,表示没有被他人修改过,则可以提交,否则不能提交。这是逻辑上的乐观锁,也避免了脏读。
    如果不管脏读的情况,就无所谓了。最坏的情况是逻辑上的悲观锁,就是在读取数据的时候就把数据加锁,直到修改提交完成。这种锁肯定不太合理,会把数据库冻住。
      

  6.   


    这样不行吧!我现在是使用这个方法,理论让应该是如果我是A,另一个用户是B,我A新增了一张单据,B登录系统将这张单据继续编辑,你说这个逻辑对吗?
    还有如果我有点击保存了这张单据,如果没有关闭当前单据,那别的用户怎么修改?
    应该是同一个单据只能有一个人进入编辑,而且是这张单据应该是我正在新增的时候,别人不能进行修改,但是有时我单据会不关闭,或者是电脑死机,无意中关闭,等情况应该如何做?
      

  7.   


    这样不行吧!我现在是使用这个方法,理论让应该是如果我是A,另一个用户是B,我A新增了一张单据,B登录系统将这张单据继续编辑,你说这个逻辑对吗?
    还有如果我有点击保存了这张单据,如果没有关闭当前单据,那别的用户怎么修改?
    应该是同一个单据只能有一个人进入编辑,而且是这张单据应该是我正在新增的时候,别人不能进行修改,但是有时我单据会不关闭,或者是电脑死机,无意中关闭,等情况应该如何做?通常情况下,都是在保存时判断是否正确。也有的系统是点了修改后,其他人都只能看不能改。
    1、保存时判断:可以在记录中增加一个修改时间字段,在读此记录时,也读取出来,保存时判断一下这个字段是否一致,如果一致,就保存,并更改这个字段为当时时间;如果不一致,就提示错误,提示已经被人修改了。
    2、只能一个人修改:在记录中增加一个字段存放当前用户账号,要修改时,先看这个字段是否为空,如果为空,可修改;如果不为空,不可修改。为了防止意外,可以不断的判断用户是否在线,如果不在线,删除掉这个字段中此用户的资料。
      

  8.   


    这样不行吧!我现在是使用这个方法,理论让应该是如果我是A,另一个用户是B,我A新增了一张单据,B登录系统将这张单据继续编辑,你说这个逻辑对吗?
    还有如果我有点击保存了这张单据,如果没有关闭当前单据,那别的用户怎么修改?
    应该是同一个单据只能有一个人进入编辑,而且是这张单据应该是我正在新增的时候,别人不能进行修改,但是有时我单据会不关闭,或者是电脑死机,无意中关闭,等情况应该如何做?通常情况下,都是在保存时判断是否正确。也有的系统是点了修改后,其他人都只能看不能改。
    1、保存时判断:可以在记录中增加一个修改时间字段,在读此记录时,也读取出来,保存时判断一下这个字段是否一致,如果一致,就保存,并更改这个字段为当时时间;如果不一致,就提示错误,提示已经被人修改了。
    2、只能一个人修改:在记录中增加一个字段存放当前用户账号,要修改时,先看这个字段是否为空,如果为空,可修改;如果不为空,不可修改。为了防止意外,可以不断的判断用户是否在线,如果不在线,删除掉这个字段中此用户的资料。方法二可行
      

  9.   

    ADOQueryTmp.Connection.BeginTrans;
      try
        //原功能代码
      finally
        ADOQueryTmp.Connection.CommitTrans;
      end;
      

  10.   

    楼猪的意思是不是多人协同把一个单据填写完?
    如果是的话:用ID作为唯一标识,把字段分配好给每个修改的人:如张三员工负责修改字段ABC,李四员工负责修改DEF。
    编辑完之后:
    张三保存:update thetable set 字段A,字段B,字段C where id=??
    李四保存:update thetable set 字段d,字段e,字段f where id=??