我现在用ADO 联接 ms SQLserver2000数据库,如何实现当A用户从数据库里调出10条数据并锁定这10条数据,1)B用户无法读出这10条数据  2)B用户只能以只读的形式调出这10条数据。当A用户处理完修改保存后并释放锁定,则B用户才能修改这些数据。
我在处理这问题时,我是增加一个锁定字段标志或锁定表。当数据被A用户以编辑状态调出,在这些数据加上锁定标志,则B将无法进行编辑,但这样做有一个问题我无法解决,就是当A用户在编辑这些数据时,突然意外死机或退出,则数据标志无法被取消,那么就会造成,数据没人编辑,而且系统却认为有人在编辑,那么就只能用手动去除数据锁定标志了:( ,请问各位兄台有没有好的处理方法,不知ms SQLserver2000本身的锁定方式能不能解决这样的问题???

解决方案 »

  1.   

    增加锁时间,由JOB定时检查时间。当锁时间足够长时,如:一个小时,自动清除锁和时间。
    程序在锁时,同时加上时间。
      

  2.   

    不知楼主是用哪种开发工具做前台应用.我在这里给你一个提示,VC方面的.
    1)B用户无法读出这10条数据
    这个我不知道怎么去做.B用户无法读出这10条数据,这个我觉得没有必要去实现.2)B用户无法读出这10条数据
    这在VC中有多种实现方法:
    (1)用CDatabase的事务去处理:
       CXxxSet.Open();
       CXxxSet.m_pDatabase->BeginTrans();   // CXxxSet是 CRecordset的派生类
       //下面是对记录集的操作
       ......
       CXxxSet.m_pDatabase->CommitTrans();
    如果你对记录集改变的过程中失败则:
      CXxxSet.m_pDatabase->RollBack();(2)调用CRecordset::SetLockingMode(parmeter);
    顺便说一下:我个人认为就查询时就不用锁定记录集.
      

  3.   

    http://expert.csdn.net/Expert/topic/1927/1927233.xml?temp=.1576654
      

  4.   

    你的要求完全可以通过SQLSERVER事务来处理,通过
    SET TRANSACTION ISOLATION LEVEL
        { READ COMMITTED
            | READ UNCOMMITTED
            | REPEATABLE READ
            | SERIALIZABLE 
        }
    来分别处理,比如:
    use pubs
    go
    set transaction isolation level SERIALIZABLEbegin tran test

    select * from sales with (tablockx)
    这样第二个用户就无法看到该表的记录。
    如果
    use pubs
    go
    set transaction isolation level read uncommitedbegin tran test

    select * from sales with (tablockx)
    这样第二个用户就看到该表的记录,但无法修改。
    MSSQLSERVER2000的LOCK的机制是非常灵活的,你可以通过HINTS指定不同的LOCK来到底自己的需求。