我在程序中用DBConnection.Execute("Lock Table Mytab In SHARE MODE NOWAIT") 对表加共享琐,以及用DBCOnnection.Execute("select * from Mytab where ID=1 LOCK FOR UPDATE NOWAIT")对某行加共享锁,以避免其它客户端的用户对数据进行修改。
但为什么其它客户端上的程序,在我锁住的这些表和行的时候,连查询(都是用的普通的Select语句)都没反应?
另外,修改和删除(执行常用的Delte和Update语句)也没反应,不过,我希望当表和行被锁住时候,在执行修改和删除操作时,能不能返回异常什么的,提示当前表或行被加锁了,不能修改了,不然其它客户端总是在那边等待修改和删除的执行而没有提示信息,就不好了。
请问是不是在用到锁的情形下,程序中所有的SQL语句都得加上相关得请求锁信息,才能避免上面得问题出现啊?
我新手,问题问得不妥请别见笑,,谢谢了。。

解决方案 »

  1.   

    普通select不会被锁的呀。
    程序中用EXCLUSIVE MODE 或者 FOR UPDATE NOWAIT锁表,然后在修改和删除前先select for update nowait一下,如果这时表是锁住的,就会有提示,否则就可以做修改和删除。
      

  2.   

    vc555() ()
    ============
    有几个基本问题想问清一下:
    1,申请锁的操作语句,是不是必需放在BeginTrans和CommitTrans/RollBackTrans之间?是不是从BegingTrans开始到committrans/rollbackTrans释放?
    2,如果某表或行,正不琐定,其他客户端程序,可不可以在不加事务的情况下用select for update nowait就可以获取表或行是否被锁的提示吗?
      

  3.   

    上面第2点打错了,更正:"正不琐定"-->"正被琐定"
    另外你说的"普通select不会被锁的呀" ,意思是不是指,我以For Update 给行加上共享锁,其它的客户端的程序,可以通过普通的select语句,查找到我这条被琐的行,只是不能修改和删除而已?
    可我在做实验的时候,用DBCOnnection.Execute("select * from Mytab where ID=1 LOCK FOR UPDATE NOWAIT")对某行加上共享锁,在另外一台机子上的程序中,查询该条记录,总是没响应,直到我这儿释放锁才可以看的到查询的结果.
    怎么回事?是我的语句写错了吗?
      

  4.   

    --------------------------------------------------------------
    您好,我们是“2006中国杰出数据库工程师评选”活动组委会。
    您的帖子已经被我们转载到本次评选官方网站的“专家在线答疑”区。
    http://www.bestdba.cn/match_discussion.aspx在那里,进入本次评选复选的90位数据库工程师将与您展开积极的互动。
    一方面,他们会为您的问题提供满意的答案,
    另一方面,也邀请您为他们投上宝贵的选票。2006-7-8 ~ 2006-7-25日,每天我们将从当天参与"有奖投票"的网友
    中抽取3名幸运者,赠送由IBM提供的精美礼品一份!此外,您还可以在“专家在线答疑”区提出新的问题并参与讨论。您的帖子位于:
    http://www.bestdba.cn/match_discussion3.aspx?pointid=287&pointid2=1&pointid3=5&pcount=stc非常感谢您对本次活动的支持!
    --------------------------------------------------------------