例如
1. A 客户 调出一条资料,做了修改,在未保存前
2. B 客户 调出同一条资料,此后 A客户 保存了资料
3. 这时B客户的资料实际上是脏数据,是保存不了的(我用的是开放式并发,即WHERE后比较所有要更新的FIELD)我以前做DBASE程式中解决方法是:A 客户调出资料时,就对该行加锁,那么B 客户只能读数据就不能更改.
我现在用.NET做的多层,后台数据库是ORACLE,ORACLE中好像可以用SELECT FOR UPDATE来加锁,但是我不知道如何用,因为我是用ADAPTER+DATASET方式更新的,SELECT FOR UPDATE好像要搭配事务吧,且如果
A客户用SELECT FOR UPDATE加锁后,网络断了,或一直锁住,不是就成死锁了?这种问题该如何处理?

解决方案 »

  1.   

    to 因为我是用ADAPTER+DATASET方式更新的,SELECT FOR UPDATE好像要搭配事务吧,且如果
    A客户用SELECT FOR UPDATE加锁后,网络断了,或一直锁住,不是就成死锁了?这种问题该如何处理?如果是多层的话,直接在数据库端进行加锁就不太适合了,毕竟牵扯一个释放的问题。可是考虑增加标志字段来限制。
      

  2.   

    我看過MSDN好像說ADO.NET是斷線的,所以不支持保守式.
    看來也只能加個FLAG字段了,不過這樣也有問題,假如更新了這個FLAG的人未保存前斷線了,那其他人不是不能更改了?
      

  3.   

    to 假如更新了這個FLAG的人未保存前斷線了,那其他人不是不能更改了?这个可以增加强制改方法,毕竟这个锁只是程序加的,并不是真正意义上的锁。
      

  4.   

    加个时间戳
    比如lastupdatetime,每次更新同时更新这个字段并且以lastupdatetime = ?做为条件,这样只要有人更新过,别人传入的更新无法更新到数据,这时提示用户数据已被其他人修改,需要重新打开才能继续操作
      

  5.   

    ADO.NET2.0
    可以通过Version来判断
    对于并发部分由用户来确认保存哪一份
    可以参考MS出版社的ADO。NET2.0的书
      

  6.   

    加时间戳不行吧,和比较所有字段有何区别?
    我是想类似于保守式并发一样,即不是更新时才提示用户,而是A用户如果在修改这个记录了,B用户在取出资料时就得到提示只能查看不能更新了,免的B用户录了一大堆数据发现不能更新!!
      

  7.   

    好像MSDN中
    版本号方法(加时间戳),保存所有值方法 ,都是更新时才处理,能不能在取出数据时就可以知道记录有否被其他人修改呢?