建立一个表单,两列:
spname,AccessLock=1
当调用时,先检查对应的AccessLock,如果为1,减1,并执行,否则退出报告Access violation.

解决方案 »

  1.   

    建立一个表单,两列:
    spname,AccessLock=1
    当调用时,先检查对应的AccessLock,如果为1,减1,并执行,否则退出报告Access violation.
      

  2.   

    seaguard(出海):
    两个进程同时执行的话,AccessLock会等于-1,你的方法不行。
    应在执行存储过程之前锁定表。创建新表
    CREATE TABLE [dbo].[TABLE22] (
    [spname] [varchar] (128) NOT NULL ,
    [status] [tinyint] NOT NULL 
    ) ON [PRIMARY]
    GObegin tran
    --锁定表
    update TABLE22 set status=1 where spname='sp_name'
    exec sp_name
    update TABLE22 set status=0 where spname='sp_name'
    commit tran
      

  3.   

    我的原来意思是
    CREATE PROC myProc
    AS
    if(TABLE22.status=1)
      BEGIN
      update TABLE22 set status=status-1 where spname='sp_name'
      EXEC sp_name
      END 
    else
      return
    GO
    你是不是指的两个进程同时进入if(TABLE22.status=0),那确实会出现statu=-1的情形,谢谢指教!
      

  4.   

    TO : foolishchao(亚超) 
    两个进程同时执行时,用事务处理会使另一个处于等待状态吗?
    如果能行,那我在每个存储过程中加入事务处理就可以了,
    为什么还要额外通过另一张表的状态来控制呢?
      

  5.   

    事务只有遇到有锁定的情况才能等待执行
    所以只要你一进这个存储过程就写上一句 UPDATE TABLE1 SET COL1 =COL1
    就可以把TABLE1上锁(当然这是上锁最笨的方式,但很简单),当另一个存储过程也想调用这句的时候,因为表已经上锁这个存储过程只能暂时挂起,直到地一个存储过程提交或回滚事务放开了锁后,第二个存储过程才能锁表