Sql server 放弃从另一个会话/连接执行存储的过程
我有一个昂贵的存储过程,它在表中的数据更改后运行,以便预先计算这些数据的某些聚合。(如果相关的话,SP由应用程序调用,而不是由表上的触发器调用,尽管这不是一个硬性要求)。存储过程几乎完全是插入到。。。选择语句 数据通常很少更改(即SP调用很少),但原则上它们可以重叠。为了确保这种情况下的一致性,我使用了Sql server 放弃从另一个会话/连接执行存储的过程,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,我有一个昂贵的存储过程,它在表中的数据更改后运行,以便预先计算这些数据的某些聚合。(如果相关的话,SP由应用程序调用,而不是由表上的触发器调用,尽管这不是一个硬性要求)。存储过程几乎完全是插入到。。。选择语句 数据通常很少更改(即SP调用很少),但原则上它们可以重叠。为了确保这种情况下的一致性,我使用了sp_getapplock,以便第二次调用将等待第一次调用完成后再继续 这是可行的,但等待是低效和不必要的——我的存储过程所做的第一件事就是删除所有现有(现已过时)数据。我真正想要的是第二次调用告
sp_getapplock
,以便第二次调用将等待第一次调用完成后再继续
这是可行的,但等待是低效和不必要的——我的存储过程所做的第一件事就是删除所有现有(现已过时)数据。我真正想要的是第二次调用告诉第一次调用“不要费心继续做你正在做的事情,事情现在已经改变了——停止运行,我会让事情保持正确的状态”
在这种情况下,第二次调用是否有可靠的方法可靠地中止第一次SP调用?每次更改后是否确实需要重新聚合 将后续更新推迟到正在进行的更新是否足够好
即使您可以中断它,您也必须等待它回滚事务,这可能需要比等待它完成更长的时间。没有一种方法可以优雅地完成这项工作。如果对一条语句发出“kill”,则可以使该语句的连接处于未知状态。此外,正如@GilM正确指出的(+1)-回滚可能需要比完成更长的时间,这取决于执行的阶段 所以这里有一个你可能没有想到的建议。您是否考虑过使用索引视图?您可以在标准版中使用它们,但需要使用
WITH(NOEXPAND)
提示来查询它们,以获得好处。但是,您可以简单地将该视图包装到另一个包含提示的视图中
这样,您就可以用一些真正有好处的东西来代替整个过程:
- 它完全透明地为您更新
- 这将比“重新聚合整个集合”更有效率