【问题标题】:How to implement Autonomous Transaction in SQL Server 2008?如何在 SQL Server 2008 中实现自治事务?
【发布时间】:2016-10-18 19:45:34
【问题描述】:

我正在尝试在 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');

过程示例代码

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

我想要的输出是

【问题讨论】:

  • 简单地说......你不能。嵌套事务是一个神话。他们甚至没有接近你认为他们应该做的。第二个事务仅增加@@TRANCOUNT 的值,并且回滚或提交将计数设置为 0,并对每个“嵌套”事务执行回滚/提交。 sqlskills.com/blogs/paul/…
  • @SeanLange 感谢您的评论,我只是想确定我们是否可以在 Sql 服务器中执行此操作或不使用nested transaction。但我认为现在我必须采用另一种方法来做到这一点。你能建议任何黑客吗?
  • 这没有“黑客”。看看你的代码。除非您违反约束,否则从逻辑上讲永远不可能进入您的内部事务。你真的想在这里做什么?也许就像在插入到 testTab2 中使用 NOT EXISTS 一样简单?对要求的一些解释将使这更容易。
  • 正如我之前所说,没有办法做到这一点。时期。故事结局。但真正的问题是你实际上想做什么,因为你很可能只需要换个角度思考它。也许您需要使用 TRY/CATCH。然后,如果您的插入失败,您可以使用 catch 插入其他地方。
  • 我只是在观察并等待微软为我们提供自主事务功能,这就是我在这篇 SO 帖子中发现自己的方式。我可能每月调查一次。

标签: sql-server database sql-server-2008 tsql transactions


【解决方案1】:

另一个博客,但写得很好,展示了模仿 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 的一个主要缺点。优点和缺点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    相关资源
    最近更新 更多