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