首页 > 解决方案 > 本机编译存储过程 sp_getapplock 替代方案

问题描述

tldr; 本机编译的存储过程中 sp_getapplock 的替代方法是什么。

我有一个内存优化表,上面的索引很少。它是关键任务应用程序。我使用的是内存优化表,因为它的日志记录最少。我正在开发订单匹配/交易匹配引擎。一次插入一个订单并与未结订单匹配。这不是批量操作。我尝试过使用常规表,但无法达到我需要的吞吐量。内存优化表解决了吞吐量问题。

我想限制 SQL 服务器不运行多个存储过程的实例。在常规存储过程中,这可以通过 sp_getapplock 来实现。如何使用本机编译的存储过程来实现这一点?

我用谷歌搜索并没有找到答案。

标签: sql-serverstored-proceduresmemory-optimized-tables

解决方案


一种方法是sp_getapplock在包装了对本机 proc 的调用的外部存储过程中执行:

CREATE PROC dbo.usp_NativeProcWrapper
AS
BEGIN TRY
    BEGIN TRAN;
    EXEC sp_getapplock 'dbo.usp_NativeProc', 'Exclusive', 'Transaction';
    EXEC dbo.usp_NativeProc;
    EXEC sp_releaseapplock 'dbo.usp_NativeProc', 'Transaction';
    COMMIT;
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0 ROLLBACK;
    THROW;
END CATCH;
GO

推荐阅读