COMMIT TRANSACTION请求没有相应的BEGIN TRANSACTION

时间:2011-04-11 15:43:07

标签: sql-server tsql transactions

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

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

  

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

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

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

这个Web服务确实被调用了很多。以前有人见过这样的东西吗?我现在完全失去了......

任何帮助或建议都非常赞赏!

3 个答案:

答案 0 :(得分:29)

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

这样的事情的例子

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

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

答案 1 :(得分:0)

我有同样的问题。这就是我解决它的方法。

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

答案 2 :(得分:0)

我的问题是我需要在BEGIN TRAN和COMMIT TRAN周围进行BEGIN和END。

BEGIN
     BEGIN TRAN

     INSERT BlaTest VALUES(5)
     GO

     COMMIT TRAN
END