防止存储过程同时执行两次
我有一个 SQL Server 2000 的存储过程,在任何给定时刻只能执行一个实例。 有什么方法可以检查并确保该过程当前没有在执行吗?
理想情况下,我希望代码是独立且高效(快速)的。 我也不想做一些事情,比如创建一个全局临时表来检查它是否存在,因为如果该过程由于某种原因失败,它将始终被视为正在运行...
我已经搜索过,我没有认为这已经被问过。 如果是的话,抱歉。
I have a stored procedure for SQL Server 2000 that can only have a single instance being executed at any given moment. Is there any way to check and ensure that the procedure is not currently in execution?
Ideally, I'd like the code to be self contained and efficient (fast). I also don't want to do something like creating a global temp table checking for it's existence because if the procedure fails for some reason, it will always be considered as running...
I've searched, I don't think this has been asked yet. If it has been, sorry.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
回复中共享的初始外部链接之一提供了有用的信息,但我个人更喜欢将独立答案/片段放在 Stack Overflow 问题页面上。 请参阅下面的代码片段,了解我使用的并解决了我的(类似)问题。 如果有人有问题(或调整建议)请留言。
One of the initial external links shared in the replies had helpful info but personally I prefer for standalone answers/snippets to be right here on the Stack Overflow question page. See below snippet for what I used and solved my (similar) problem. If anyone has problems (or adjustment suggestions) please chime in.
是的,有办法。 使用所谓的 SQL Server 应用程序锁。
编辑:是的,这也适用于 SQL Server 2000 。
yes there is a way. use what is known as SQL Server Application locks.
EDIT: yes this also works in SQL Server 2000.
您可以使用 sp_getapplock sp_releaseapplock 如锁定 存储过程仅供单次使用。
但是,这真的是你想要做的吗? 您是否正在尝试获取具有高隔离级别的事务? 在应用程序级别处理这种类型的并发性也可能会更好,因为一般高级语言对于此类事情有更好的原语。
You can use sp_getapplock sp_releaseapplock as in the example found at Lock a Stored Procedure for Single Use Only.
But, is that what you are really trying to do? Are you trying to get a transaction with a high isolation level? You would also likely be much better off handling that type of concurrency at the application level as in general higher level languages have much better primitives for that sort of thing.
锁定一个虚拟表怎么样? 如果发生故障,这不会导致死锁。
how about locking a dummy table? That wouldn't cause deadlocks in case of failures.
在程序开始时检查数据是否被“锁定”,如果没有锁定则
在程序结束时解锁该数据。
IE
At the start of the procedure check if piece of data is 'locked' if not lock it
At end of procedure unlock the piece of data.
ie