TSQL 错误:提交事务请求没有相应的开始事务



我正在学习 TSQL,并在尝试更新产品表中的列时收到错误。它告诉我 COMMIT TRANSACTION 请求没有相应的 BEGIN TRANSACTION,但我在 sproc 的顶部有一个 begin 事务。任何帮助,不胜感激。

 alter proc dbo.ProductOrders
@ProdId int, @ProductPrice smallmoney
as
Declare @timesOrdered int, @ProductId int,
Declare  @counter int,  @return_value int
Declare @time timestamp, @irowCount int
set transaction isolation level read uncommitted
set nocount on
set @counter = 0
while(@counter < 3)
begin
begin transaction
select @ProductId = ProductId, @ProductPrice = UnitPrice, @time = ProductStamp
from dbo.Products
where ProductId = @ProdId
select @timesOrdered = COUNT(ProductId)
from dbo.Products
where ProductId = @ProdId 


if(@timesOrdered < 2)
begin
raiserror('Product hasnt been ordered enough to raise price',16,1)
rollback transaction 
break
end


EXEC    @return_value = [dbo].[UpdateProduct]
        @ProductPrice = @ProductPrice,
        @ProdId = @ProdId,
        @time = @time,
        @eRowCount = @irowCount OUTPUT

SELECT  'Return Value' = @return_value


if @return_value <> 0
begin
raiserror ('Product not updated, error occured',16,1,@return_value) 
return @return_value
end
if(@irowCount = 0)
begin
print 'another transaction is trying to access the data'
set @counter += 1
rollback transaction
end
raiserror('Price updated',16,1)
commit transaction
set @counter = 0
return 0
    end--end while loop
    if(@counter = 3)
    begin
    raiserror('try again later',16,1)
    return 99
    end

您的代码正在调用 ROLLBACK 然后也提交,请尝试以下修正:

...
    if(@irowCount = 0)
    begin
      print 'another transaction is trying to access the data'
      set @counter += 1
      rollback transaction  
    end
    else
    begin
      raiserror('Price updated',16,1)
      commit transaction  
      set @counter = 0
    end
...

你在ROLLBACK后错过了RETURN吗?

您的代码正在点击ROLLBACK,然后在几行后调用COMMIT...

一旦你调用ROLLBACK,就不再有任何事务要COMMIT,所以你可以开始一个新的事务(我敢肯定不是你想要的),或者确保你只在ROLLBACK尚未调用的情况下调用COMMIT

> 我最近在分布式环境中使用 SQLserver 2012 时遇到了类似的问题。基本上,我们使用多个线程发送批量请求。即使其中一个线程失败,与该线程相关的所有记录在数据库中也可用。调查配置后,我们观察到我们没有在连接字符串中禁用"登记"。默认情况下,登记值为 true,并且已启用。禁用登记值后,我们没有观察到上述异常,并且多线程方案可以正常工作。将以下配置添加到 web.config 连接字符串。

Enlist=false

最新更新