对了,是不是可以对此存储过程首尾加上begin tran和commit tran呢
第二个用户要调用的时候先判断一下:IF @@TRANCOUNT > 0,只是这个办法只适用调用此一个存储过程,如果在调用此过程时还有其他tran在调用中,可能就行不通了,不过是不是还可以再在tran上想点办法呢

解决方案 »

  1.   

    declare @isRun bit
    begin tran
    select @isRun = flag from control_table with XLOCK
    where name = 'RUN_FLAG'
    if @isRun
    begin
       rollback tran
       return -1
    endupdate control_table set flag = 1 where name = 'RUN_FLAG'
    commit tran--其他执行代码
      

  2.   

    学DB不久,请教:
    select @isRun = flag from control_table with XLOCK
    是什么意思?谢谢!
      

  3.   

    谢谢大家捧场,谢谢bluepower2008(蓝色力量)的精彩回答
    to hcgui(浪子),你问得好,再麻烦bluepower2008(蓝色力量)解释一下
      

  4.   

    谢谢大家捧场,谢谢bluepower2008(蓝色力量)的精彩回答
    to hcgui(浪子),你问得好,再麻烦bluepower2008(蓝色力量)解释一下非常感谢!
      

  5.   

    with xlock是通知系统(如查询优化器)执行此语句使用排它加锁方式(默认时select只是不可写但可读的加锁方式)。
    不过感觉这个还是不对,在select完毕之后与update之前其他进程有可能进入。
    不如对整个事务设置最高隔离级别。或者利用单个update语句:
    update yourtbl set flag=1 where flag=0
    if @@rowcount>0 
    ...
      

  6.   

    to wanghu(不懂就是不懂):对整个事务设置最高隔离级别,如何设置?                       如何处理这种因加锁引起的错误?
      

  7.   

    对不起,前两天没有上网,所以没有及时回答大家的问题。
    to wanghu(不懂就是不懂):在select语句中指定锁类型,该锁会保持到由语句所处理的全部数据上的事务结束,所以我在select语句前加上了begin tran,在该事务没有回滚或提交前,select出来的记录都不会被其他进程操作,不会出现你感觉的问题。
    当然使用你所说的对整个事务设置最高隔离级别,也是可以,但这种方式的并发级别很低,在编程时应尽量避免。另外,回答shenxin(木头)的问题:
    1。加锁时间不会很长,应该是毫秒级,在加锁时,其他的调用只有等待锁的释放,如果锁的时间很长,最后得到的错误提示是执行sql语句超时。超时时间在设置服务器时指定,可由程序对特定的操作指定特定的超时时间。
    2。对整个事务设置最高隔离级别的语句是:
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 
      

  8.   

    to bluepower2008(蓝色力量),非常感谢,我先试试看。
    能交个朋友吗,我是初学SQL SERVER,有很多问题呢
      

  9.   

    to shenxin(木头):
      我也刚学不就,咱们也可以聊聊。[email protected]
      

  10.   

    to : shenxin(木头) 
    可以,在数据库版块,大家就是朋友。
      

  11.   

    to:everyone
    朋友多多--〉[email protected]
      

  12.   

    非常高兴和大家做朋友
    我的Email: [email protected]
    OICQ:2581130