Запрос COMMIT TRANSACTION не имеет соответствующей BEGIN TRANSACTION

Здесь странная проблема, с которой я сталкиваюсь на производственном сервере. Это произошло дважды за последние две недели, и это сервер, который получает много трафика.

У нас есть код в веб-службе, который выполняет BEGIN TRAN, затем запускает несколько SQL-запросов (две вставки, за которыми следует обновление). Затем в конце выполняется a COMMIT. Дважды мы получили сообщение в журналах:

Запрос COMMIT TRANSACTION не имеет соответствующей BEGIN TRANSACTION.

Между первыми двумя вставками и обновлением мы вызываем другую веб-службу, поэтому может быть небольшая задержка между первыми двумя вставками и последним обновлением до вызова COMMIT. Может ли это быть причиной нашей проблемы? Мы запускаем это на IIS 7 и Server 2008 R2 (все обновленные).

Первоначально мы, хотя это могли быть пулы приложений, которые были переработаны, но изменили это, чтобы переработать в середине ночи. Теперь я не уверен, что заставило бы SQL-сервер забыть вызов BEGIN TRAN.

Этот веб-сервис действительно называется немного. Кто-нибудь видел что-то подобное раньше? В настоящий момент у меня полная потеря...

Любая помощь или предложение очень ценились!

Ответ 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

Хорошая статья о транзакциях - Обработка ошибок в SQL 2005 и более поздних версиях Erland Sommarskog

Ответ 2

У меня была такая же проблема. Это то, что я сделал для его решения.

Запрос COMMIT TRANSACTION не имеет соответствующего BEGIN TRANSACTION

После того, как я проверил SQL Query и Add a 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)+'-'[email protected],
        IsActive=0 
        where [email protected] and [email protected]                     
        if(@@ERROR=0)
          begin
            commit Tran
            select 0
          end
        else
          begin
            rollback Tran
            select -1
          end


    end

Ответ 3

Моя проблема была в том, что мне нужно было НАЧАТЬ и ЗАКОНЧИТЬСЯ вокруг моего НАЧАЛА ТРАНСА и COMMIT TRAN.

BEGIN
     BEGIN TRAN

     INSERT BlaTest VALUES(5)
     GO

     COMMIT TRAN
END