问题 在存储过程中抑制事务


我想知道是否可以抑制SQL存储过程中的事务。我的SP中有以下情况(我希望实现):

WHILE TRUE
BEGIN TRY
    BEGIN TRANSACTION A
    RECEIVE MESSAGE FROM SSB QUEUE WITH TIMEOUT

    BEGIN SUPPRESS TRANSACTION 
      WHILE RECORD IN TABLE
         BEGIN TRANSACTION B
           DELETE RECORD FROM TABLE OUTPUT RECORD INTO D
           SEND RECORD D TO OTHER SSB QUEUE
         COMMIT TRANSACTION B
    END SUPPRESS TRANSACTION
    COMMIT TRANSACTION A
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION A
END CATCH

所以我真正想做的是事务B没有被列入事务A :)


3399
2017-09-16 09:29


起源

好时机先生,我刚刚发布这个...而且看起来像是在处理一个非常类似的问题给出你的代码:) - amarsuperstar


答案:


您正在描述一个“自治事务”,这是人们从Oracle(支持它们)迁移到MSSQL(不支持它们)的常见问题。 本文 解释了各种选项,遗憾的是它们不是特别有吸引力:

  1. 环回链接服务器
  2. 来自CLR过程的环回连接
  3. 存储数据的表变量,因为它们不受回滚影响
  4. 来自扩展存储过程的环回连接(但不管怎样,它们都被弃用以支持CLR过程)

如果这些选项都不适用于您,另一种选择是将某些控件转移到应用程序中并移出数据库,但当然这只是将问题转移到另一个位置。不过,这可能值得考虑。


10
2017-09-16 11:37