如何在SQL Server 2008中实现自治事务?

Avi*_*hek 5 t-sql database sql-server transactions sql-server-2008

我正在尝试在 SQL Server 2008 过程中实现自治事务。该过程将只有两个嵌套事务,将InnerTransaction提交但OuterTransaction将回滚。我见过很多成功实现逆向过程的例子。但我还没有找到任何解决我的问题的方法。

示例表脚本

create table testTab1(id int identity(1,1) primary key, name varchar(100));
create table testTab2(id int , name varchar(100));
insert into testTab1(name) values('User1'),('User2'),('User3');
Run Code Online (Sandbox Code Playgroud)

程序示例代码

CREATE PROCEDURE [dbo].[testSP2]
AS
BEGIN
SET IMPLICIT_TRANSACTIONS ON
BEGIN TRAN 
    insert into testTab1(name) values('User4'),('User5'),('User6');
    IF @@ROWCOUNT>0
        BEGIN
            SAVE TRAN InnerTran
                insert into testTab2(id,name) values(1,'User4'),(2,'User5'),(3,'User6');
                --PRINT 'NUMBER OF TRAN='+CAST(@@TRANCOUNT AS VARCHAR(5)) 
            COMMIT TRAN InnerTran
        END                 
ROLLBACK
SET IMPLICIT_TRANSACTIONS OFF
END
Run Code Online (Sandbox Code Playgroud)

我想要的输出是

在此输入图像描述

Cod*_*ice 2

另一个博客,但写得很好,展示了模仿 Oracle 出色的自主事务功能的每个“黑客”。我期待 SQL Server 中存在此功能。

https://techcommunity.microsoft.com/t5/sql-server/how-to-create-an-autonomous-transaction-in-sql-server-2008/ba-p/383471

注意:出于某种原因,当你向 SQL Server 人员提出这个问题时,他们会看着你,就像你疯了一样,并开始问诸如“为什么你需要那个......为什么有人需要那个?”之类的问题。现在我在 SQL Server 商店里,我经常听到这样的情况。只要知道,如果您来自 Oracle……一个具有强大而深入的功能的数据库,例如内置的出色搜索算法以及出色的字符串解析和操作功能,您在深入研究 SQL Server 后会发现它缺乏这些功能。不要误会我的意思... SQL Server 在很多方面都做得很好,例如表变量和临时表,以及将 T-SQL 与普通 SQL 正确混合的能力。Oracle 将 PL-SQL 与其 SQL 引擎分开,这是 Oracle 的一大缺点。优点和缺点。

  • 尽管我只使用过 SQL Server,从未使用过 Oracle,但自治事务的用例每隔一两年就会出现一次。这将是一个非常方便的功能。对我来说,主要用例是写入日志表,无论事务的结果如何。如果我们完全控制事务,那么我们可以使用变量或表变量(未在事务中注册)来存储我们想要记录的数据,并在事务回滚(或提交)后记录它。但有时存储过程已注册到外部事务中,但仍然需要记录消息。 (2认同)