我要做一个程序,遇到与卖火车票同样情况的问题.就是如何锁住数据库表,不让其他人同时操作;而当我的操作完成后,其他人方可以继续执行.

解决方案 »

  1.   

    锁住1个数据库表是不太好的方案,想一下,1号窗口可以卖票,难道2号窗口就不可以卖票了吗?
    我想起来以前用过的FOXPRO可以锁定1条记录,应该考虑这方面。
      

  2.   

    请问可否锁住表? 事务处理完后,再开锁.SQLServer2000里 用 select * from table With(HOLDLOCK)但是,我不知道代码如何写和调试通.有请高手帮忙!!
      

  3.   

    需要解决的问题一是: 我Insert into 一条记录到某个表里,该表中的ID[自动编号]会自动生成,而程序需要将此ID值同时添加到另外一个表里. 问题是该ID值如何取得?? 如果用Max(ID)的话,需要锁住表才能保证别人不会在这个时间也添加记录. 如果用乐观或悲观锁记录好像不能解决问题的啊
      

  4.   

    用 select * from table With(HOLDLOCK) 好像是鎖不住的
      

  5.   

    以读占方式打开数据库就是了
    Rst1.Open "select * from tUsers " ,Cnn1, adOpenKeyset, adLockReadOnly
     这样别人只能读。不能写数据库了
      

  6.   

    Rst1.Open "select * from tUsers " ,Cnn1, adOpenKeyset, adLockReadOnly
    锁住后,自己都不能编辑了.
    而用悲观锁,只能所当前编辑的记录,而别人还是能够增加记录的,到时候,记录总和或返回的id都不能保证.
    经过2天的思考与测试,终于找到方法了,并测试通过.今将代码发布給正在关注的大家,还请指教一二:
            '锁定帐务表,然后添录帐务记录,完成对帐务记录添加后,获得当前最大ID号
            'myData.connData 是用Data Environment方式建立的连接方式,大家也可以用
            'Rs.Open的方式执行        myData.ConnData.BeginTrans '开始事务处理
            myData.ConnData.Execute "Select * From 帐务表 With(TABLOCKX)" '注意这是锁定帐务表,别人此时不能读和写,只能是等待状态
            myData.ConnData.Execute "Insert into 帐务表 (ID," & s_帐务项目 & ",发生时间,摘要,属性) Values " & _
            "(" & i_ID & "," & Text5(1).Text & ",'" & DTPicker2.Value & "','收支帐_" & Combo1.Text & "," & ReplaceSQL(Combo5.Text) & "','" & s_帐务项目 & "')"
            If Rs.State <> adStateClosed Then Rs.Close
            Rs.Open "Select Max(ID) From 帐务表", Conn, adOpenForwardOnly, adLockReadOnly
            i_帐务ID = Rs(0) '获的无干扰的ID值
            myData.ConnData.CommitTrans '注明事务完成,此时系统自动将锁定表解锁'此程序用在SQLServer2000上通过,对于Access就没试过,Access单机版本估计也无需用到的啦.
      

  7.   

    为什么CSDN -VB 里没有高手啊Select * From 帐务表 With(TABLOCKX)" TABLOCK 使用表锁代替粒度更细的行级锁或页级锁。在语句结束前,SQL Server 一直持有该锁。但是,如果同时指定 HOLDLOCK,那么在事务结束之前,锁将被一直持有。 TABLOCKX 使用表的排它锁。该锁可以防止其它事务读取或更新表,并在语句或事务结束前一直持有。 READPAST 跳过锁定行。此选项导致事务跳过由其它事务锁定的行(这些行平常会显示在结果集内),而不是阻塞该事务,使其等待其它事务释放在这些行上的锁。READPAST 锁提示仅适用于运行在提交读隔离级别的事务,并且只在行级锁之后读取。仅适用于 SELECT 语句。 HOLDLOCK 将共享锁保留到事务完成,而不是在相应的表、行或数据页不再需要时就立即释放锁。HOLDLOCK 等同于 SERIALIZABLE。