如题。比如,有客户端A和B,当他们同时读取数据库中同一个表的记录时,可以正常访问;但如果A准备更改SQL Server中某个表的记录内容时,如何暂时禁止B或其他客户端对该表记录的读取和更新?

解决方案 »

  1.   

    事务处理不是只能用来保证一系列更新操作的完整性吗,其中任何一个操作失败,可以提供回滚之前所作更改的功能,如何用来解决冲突呢?我不太懂数据库,请大家指点一下。
    我想解决一种情况下的问题,客户端A要对表中某一字段的值进行累加1的操作,如10->11;恰好此时,另一个客户端B也需要进行同样的操作,最后正确的结果当然是10->11->12,可是因为是同时进行的,所以客户端A读取的当前值为10,就累加1后,更改字段的值为11;客户端B上也发生了完全相同的一次操作,最后的结果就是字段的值被更改为11了两次,而不是我们希望的结果。这种数据库访问冲突的问题如何处理?
      

  2.   

    怎么加锁?可否请楼上兄弟给个用ADO实现的大概的代码供参考一下,或有没有相关的文档介绍?具体的我可以自己研究,先拜谢了!
      

  3.   

    你用ado打开表的时候,不是有关于lock的选项吗?看msdn就知道了
      

  4.   

    谢谢楼上各位的提点,找到解决方法了。下面整理一下,希望以后对其他朋友有帮助。当我们更新数据库中记录之前,会先通过_RecordsetPtr智能指针调用下面的方法打开想要更新的记录(集):HRESULT Recordset15::Open ( const _variant_t & Source, const _variant_t & ActiveConnection, enum CursorTypeEnum CursorType, enum LockTypeEnum LockType, long Options )然后再调用Update方法实现更新记录内容操作。而要解决本贴中提到的冲突问题,可以在上面Open方法中参数4中,把LockType指定为adLockPessimistic(简要说明:悲观锁定,也有的资料会译为保守式并发。使用此参数时,从你Open方法所打开的记录集中(注意:不是数据库中的)任一字段内容被更改后,一直到调用Update方法实际更新数据库记录集内容之前,数据库中此记录集是处于锁定状态的,如果其他进程或客户端也试图更新数据库中此记录集内容的话,就会出错。)或adLockOptimistic(简要说明:乐观锁定,有的资料会译为开放式并发。使用此参数时,与前面adLockPessimistic相比只有一点区别,即仅在你调用Update方法对数据库中记录集进行更新时才锁定相应记录集,其他二者相同,Update方法成功调用后,即自动解除记录集的锁定。)。小子在此感谢大家的指点!!结贴。