关于sql server:COMMIT TRANSACTION请求没有对应的BEGIN TRANSACTION

The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION

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

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

The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.

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

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

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

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


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

这样的例子

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

现在运行这个

1
2
3
4
5
6
BEGIN TRAN

INSERT BlaTest VALUES('a')
GO

COMMIT TRAN

这是错误

1
2
3
4
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.

这将毫无问题地运行

1
2
3
4
5
6
BEGIN TRAN

INSERT BlaTest VALUES(5)
GO

COMMIT TRAN

一篇关于事务的好文章是 Erland Sommarskog 在 SQL 2005 及更高版本中的错误处理


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

1
2
3
4
5
6
7
8
BEGIN
     BEGIN TRAN

     INSERT BlaTest VALUES(5)
     GO

     COMMIT TRAN
END


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

COMMIT TRANSACTION请求没有对应的BEGIN TRANSACTION

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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