请问如何在.Net下实现对数据库的同步访问?
   例如,2个用户同时在线,并且操作同一个功能模块的同一条记录,其中用户A已经进入该记录的修改页,与此同时用户B却在A用户还未完成修改就将该记录删除。本人按上述情况做了一个实验,结果是修改后返回主浏览页面,用户A不能找到其修改的记录。现在的要求是,在用户A进行修改操作时,用户B不能对其进行删除,直至A完成修改操作。如何控制这里的并发访问?

解决方案 »

  1.   

    当用户A取数据时,获取数据的方式设为独占,这样别的用户是不能修改数据的。只能读。
    或者按  Knight94(愚翁) 的说法,在数据库中加一个字段,用来标志该纪录的操作状态。
      

  2.   

    请 wsmall1(最近很忙) 把独占的实现方法介绍的更详细些,因为小弟看得不是很明白。对于Knight94(愚翁) 的建议小弟也想过,觉得还是有些问题。比如,用户A和用户B几乎同时进入同一条记录的修改页面(即A的操作还没来得及改变标志状态字段的值,B就也跟着进去了),使得标志状态字段的值由慢半拍的B改变,可能最终导致B修改的内容覆盖了A修改的内容。
      

  3.   

    不知道你用的什么数据库。
    可以在A进入时,给数据加锁,这时B就不能访问了,A完成后再解锁,B才能访问。
      

  4.   

    我用的DBMS是MS SQL Server 2000, 不知 soaringbird(飞翔鸟) 是如何给数据加锁的,请明示!
      

  5.   

    begin transaction
    update 语句
    commit
    这样,在A完成改变标志字段之前,B是进不来的。
    update 自动就是带锁的,select语句也可以加锁,比如在一个显式事务中,执行select * from 表名 with (tablockx)
    这样即可锁住这个表,在事务提交或回滚之前,其他人是不能使用的,所以,这种操作必须要快,否则长时间的锁表,就会影响你的系统的运行效率。
    即使不用显式事务,而只是一条update语句,update也不会被另一个用户中断
      

  6.   


    这个方法理论上是可行的在数据库中加一个字段,用来标志该纪录的操作状态。比如是UpdateLock   0,1但A用户点击修改的时候,就触发一个动作,把相应的UpdateLock改为1这样B用户删除的时候,看加个条件,看看这条记录的UpdateLock   是否为 0为0的就执行删除语句为1的就告诉B用户,改记录正在被修改,无法删除最后等A用户修改完成后把UpdateLock   设置为 0这样就应该解决问题了