我有一个昂贵的存储过程,它在表中的数据更改后运行,以便预先计算这些数据的一些聚合。(如果相关,SP 由应用程序调用,而不是由表上的触发器调用,尽管这不是硬性要求)。存储过程几乎完全是一个INSERT INTO ... SELECT
语句。
数据通常不经常更改(即 SP 调用不频繁),但原则上它们可以重叠。为了确保在这种情况下的一致性,我使用sp_getapplock
这样第二次调用将等待第一次调用完成后再继续。
这可行,但等待效率低下且不必要 - 我的存储过程所做的第一件事是删除所有现有(现已过时的)数据。我真正想要的是第二次调用告诉第一个“不要打扰你正在做的事情,现在事情已经改变了 - 停止运行,我会让事情保持正确的状态”。
在这种情况下,第二次调用是否有可靠地中止第一次 SP 调用的可靠方法?