你应该保证这个存储过程有防止并发错误(死锁、数据混乱)的机制. 一种办法: 
在存储过程的开始对本存储过程中的关键表加锁,存储过程完成后解锁.  当存储过程访问一个正在被枷锁的表时, 会自动等待, 如果等待超时, 会发出一个错误.加锁应该是在一个事务内进行的, 解锁也是在一个事务结束时发生.
你必须保证存储过程退出时提交/撤销事务, 也同时保证了解锁.
如果存储过程异常中止, 在系统息动撤销事务的时候也同时解锁.
 
我说的不全面, 也可能有误, 仅供你参考. 建议你阅读有关的书籍.  

解决方案 »

  1.   

    我的理解如下:CREATE PROCEDURE [P_name] ASBEGIN TRANSELECT * FROM table1 (TABLOCKX) WHERE 1=2
    SELECT * FROM table2 (TABLOCKX) WHERE 1=2
    -- 以上加锁, 锁将保持到事务结束. 如果加锁冲突, 会等待其他线程解锁. 如果等待超时, 会发出错误给前端.
    ......COMMIT
    -- 在此提交并解锁RETURN
      

  2.   

    4no兄,如果在对表加锁后和提交事务前的语句处理出现异常,该如何解锁?谢!
      

  3.   

    4no兄,非常感谢!问题已经解决!发分