【问题标题】:TSQL error: The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTIONSQL错误:COMMIT TRANSACTION请求没有对应的BEGIN TRANSACTION
【发布时间】:2016-03-31 15:18:26
【问题描述】:

我正在学习 TSQL,但在尝试更新产品表中的列时出现错误。它告诉我 COMMIT TRANSACTION 请求没有相应的 BEGIN TRANSACTION,但我的存储过程顶部有一个开始事务。任何帮助表示赞赏。

 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

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    您的代码调用 ROLLBACK 然后也 COMMIT,试试这个修改:

    ...
        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...

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

    【讨论】:

    • 我试图实现的是,如果数据在其他人更新后已经更新,则回滚事务,如果不提交!所以我应该在@rowcount if 结束后有一个 else ?
    • 是的,将您的 COMMIT 包装在 else 语句中,这样您就可以确保在 ROLLBACK 之后永远不会调用它
    【解决方案2】:

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

    Enlist=false
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-02
      • 2017-06-30
      • 2021-06-03
      相关资源
      最近更新 更多