这是我在生产服务器上遇到的一个奇怪的问题。它在过去两周内发生了两次,这是一个获得大量流量的服务器。
我们在Web服务中有一些执行BEGIN TRAN
的代码,然后运行一些SQL查询(两个插入后跟一个更新)。然后在最后执行COMMIT
。现在两次我们在日志中收到了消息:
COMMIT TRANSACTION请求没有相应的BEGIN TRANSACTION。
在前两个插入和更新之间,我们调用另一个Web服务,因此在调用COMMIT
之前,前两个插入和上次更新之间可能会略有延迟。这会导致我们的问题吗?我们在IIS 7和Server 2008 R2上运行它(已全部更新应用)。
最初我们虽然它可能是应用程序池被回收,但改为在半夜回收。现在我不确定是什么原因导致SQL服务器忘记调用BEGIN TRAN
。
这个Web服务确实被调用了很多。以前有人见过这样的东西吗?我现在完全失去了......
任何帮助或建议都非常赞赏!
答案 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