【问题标题】:Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 1, current count = 2EXECUTE 之后的事务计数表明 BEGIN 和 COMMIT 语句的数量不匹配。先前计数 = 1,当前计数 = 2
【发布时间】:2016-07-21 07:35:26
【问题描述】:

我写了这个触发器:

ALTER TRIGGER [dbo].[trg_abort_insert]
ON [dbo].[F_DOCCURRENTPIECE]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON
SET XACT_ABORT ON
BEGIN TRY
    BEGIN TRAN

IF EXISTS (SELECT * 
           FROM Inserted i  
           INNER JOIN Deleted d ON i.CBMARQ= d.CBMARQ
           WHERE i.DC_Piece <> d.DC_Piece 
             AND i.DC_Domaine = 0

            AND i.DC_IdCol = 6)
COMMIT TRAN
END TRY
BEGIN CATCH  
SELECT ERROR_MESSAGE()
IF @@TRANCOUNT>0
        ROLLBACK
END CATCH;
END

我遇到了这个错误: EXECUTE 之后的事务计数表明 BEGIN 和 COMMIT 语句的数量不匹配。先前计数 = 1,当前计数 = 2

请帮帮我

【问题讨论】:

  • 问题是因为你有一个带有事务的触发器。这导致了无数的悲伤。我 99.9999% 确定您的调用代码在交易中,对吗?从触发器中删除事务。
  • 好的,当我删除开始事务并提交事务时,触发器就像不识别捕获一样。开始 trans 和 commit 是必不可少的,因为仅使用 try catch 不会执行代码,而且当我删除 ty catch 时,我遇到了这个错误:事务在触发器中结束。该批次已中止。
  • 事务的存在不会影响语句流或阻止 try/catch 工作。你真的想在这里做什么?触发器中的事务不会起作用,因为任何 dml 语句中已经存在隐式触发器。如果您能解释您的要求,我们可以帮助您解决此问题。
  • 这无助于解释您要做什么。也许你应该看看这里。 spaghettidba.com/2015/04/24/…

标签: sql-server tsql triggers


【解决方案1】:

这是因为您有嵌套事务。我的意思是触发触发时事务已打开。您需要修改触发器以处理嵌套事务,如下所述:

create TRIGGER [dbo].[trg_abort_insert]
ON [dbo].[F_DOCCURRENTPIECE]
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON
SET XACT_ABORT ON
declare @trancount int = @@trancount

BEGIN TRY
    if @trancount > 0
        begin
            save transaction t1
        end
    else
        begin
            begin transaction
        end

IF EXISTS (SELECT * 
           FROM Inserted i  
           INNER JOIN Deleted d ON i.CBMARQ= d.CBMARQ
           WHERE i.DC_Piece <> d.DC_Piece 
             AND i.DC_Domaine = 0

            AND i.DC_IdCol = 6)

    if @trancount = 0
        begin           
            COMMIT TRAN
        end
END TRY
BEGIN CATCH 

    if @trancount > 0
        rollback transaction t1
    if @trancount = 0
        rollback transaction
    SELECT ERROR_MESSAGE()

END CATCH;

结束

这应该适合你。让我知道这是否有帮助。

【讨论】:

  • 非常感谢,我刚刚试了一下,效果很好,非常感谢
猜你喜欢
  • 2014-03-22
  • 2014-10-25
  • 1970-01-01
  • 2012-02-18
  • 2015-06-23
  • 2016-06-21
  • 1970-01-01
  • 2018-03-11
  • 2015-12-21
相关资源
最近更新 更多