【问题标题】:The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTIONCOMMIT TRANSACTION 请求没有对应的 BEGIN TRANSACTION
【发布时间】:2011-04-11 15:43:06
【问题描述】:

这是我在生产服务器上遇到的一个奇怪问题。过去两周发生了两次,这是一个流量很大的服务器。

我们在 Web 服务中有一些代码执行 BEGIN TRAN,然后运行一些 SQL 查询(两个插入,然后是一个更新)。然后最后执行COMMIT。现在我们已经两次在日志中收到消息:

COMMIT TRANSACTION 请求没有对应的 BEGIN TRANSACTION。

在前两次插入和更新之间,我们调用了另一个 Web 服务,因此在前两次插入和调用 COMMIT 之前的最后一次更新之间可能会有一点延迟。这会导致我们的问题吗?我们在 IIS 7 和 Server 2008 R2 上运行此程序(已应用所有更新)。

最初我们虽然可能是应用程序池被回收,但将其更改为在半夜回收。现在我不确定是什么导致 SQL 服务器忘记调用BEGIN TRAN

这个网络服务确实被调用了很多次。有没有人见过这样的东西?我现在完全不知所措……

非常感谢任何帮助或建议!

【问题讨论】:

标签: sql-server tsql transactions


【解决方案1】:

看起来你的事务失败了,被回滚了,没有什么可以提交

这样的例子

CREATE TABLE BlaTest(id INT PRIMARY KEY NOT NULL)
GO

现在运行这个

BEGIN TRAN

INSERT BlaTest VALUES('a')
GO

COMMIT TRAN

这是错误

Msg 245, Level 16, State 1, Line 3
Conversion failed when converting the varchar value 'a' to data type int.
Msg 3902, Level 16, State 1, Line 2
The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.

这将毫无问题地运行

BEGIN TRAN

INSERT BlaTest VALUES(5)
GO

COMMIT TRAN

一篇关于交易的好文章是 Erland Sommarskog 的 Error Handling in SQL 2005 and Later

【讨论】:

  • 这对我来说没有任何意义。如果交易失败,错误信息会不会不一样?
  • +1 - @sophtware 的简单解决方法是添加 IF @@TRANCOUNT > 0 COMMIT TRAN。这将检查未结交易。你可以在ROLLBACK 之前做同样的事情。
  • 现在很有意义!谢谢!我会检查一下。也许我应该查看日志以获取有关交易的更多信息?
【解决方案2】:

我的问题是我的 BEGIN TRAN 和 COMMIT TRAN 周围需要一个 BEGIN 和 END。

BEGIN
     BEGIN TRAN

     INSERT BlaTest VALUES(5)
     GO

     COMMIT TRAN
END

【讨论】:

  • 我会说你错了。
【解决方案3】:

我有同样的问题。这就是我为解决它所做的。

COMMIT TRANSACTION 请求没有对应的BEGIN TRANSACTION

检查SQL 查询并添加BEGIN TRAN 后,它将成功执行。这是我的示例代码。它会起作用的:

ALTER procedure [dbo].[DeactivateUser]
    @UserId bigint,
    @LoginEmail Nvarchar(100),
    @merchantId int
    as
    Begin
      Begin tran

        update Users set 
        LoginEmail='inactive'+CONVERT(VARCHAR(11), getdate(), 106)+'-'+@LoginEmail,
        IsActive=0 
        where LoginEmail=@LoginEmail and MerchantID=@merchantId                     
        if(@@ERROR=0)
          begin
            commit Tran
            select 0
          end
        else
          begin
            rollback Tran
            select -1
          end


    end

【讨论】:

  • 它不是发生在我身上的一个例子。所以我分享了答案,任何会如何看待这个。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
  • 2021-06-03
  • 2017-06-30
相关资源
最近更新 更多