我有一个存储过程,我想确保它不能同时执行。
我的(多线程)应用程序通过这个存储过程在基础表上完成所有必要的工作。
IMO,锁定表本身是一个不必要的激烈行动,所以当我发现sp_GetAppLock
,它基本上强制执行关键部分时,这听起来很理想。
我的计划是将存储过程封装在事务中并设置spGetAppLock
事务范围。该代码已成功编写和测试。
代码现在已经提交审查,我被告知我不应该调用这个函数。然而,当问一个明显的问题“为什么不?”时,我得到的唯一原因是高度主观的,与任何形式的锁定都复杂有关。
我不一定会买这个,但我想知道是否有人有任何客观原因为什么我应该避免这种结构。就像我说的那样,考虑到我的情况,关键部分对我来说是一种理想的方法。
更多信息:应用程序位于此之上,有 2 个线程 T1 和 T2。每个线程都在等待不同的消息 M1 和 M2。所涉及的业务逻辑表明,只有在 M1 和 M2 都到达时才能进行处理。存储过程记录 Mx 已到达(插入),然后检查 My 是否存在(选择)。内置锁定可以确保插入连续发生。但是选择也需要连续发生,我认为我需要在此处的内置功能之外做一些事情。
为清楚起见,我希望“处理”只发生一次。所以我不能让存储过程返回误报或漏报。我担心如果存储的过程很快连续运行两次,那么两个“选择”都可能返回表明它适合执行处理的数据。