Запрос 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