【问题标题】:Error: The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION错误:ROLLBACK TRANSACTION 请求没有对应的 BEGIN TRANSACTION
【发布时间】:2014-01-23 21:43:14
【问题描述】:

我有存储过程,里面有一个事务。

当我用 SQL Server management studio 执行它时没有错误,但是当我用我的 C# 代码执行它时,会出现以下错误:

ROLLBACK TRANSACTION 请求没有对应的 BEGIN TRANSACTION

代码是:

CREATE PROCEDURE [dbo].[AddHardDisk]
    @name nvarchar(50), @brand nvarchar(50), @serial nvarchar(50), @cost float,  @seller nvarchar(50),@note nvarchar(1000),@buyDate Date,
    @size int ,@moneyType nvarchar(50)

AS

    DECLARE  @addedDeviceID int

 BEGIN TRY
    BEGIN  TRAN   

        insert into Product(Name,Brand,Serial,Cost,Seller,Note,MoneyType,BuyDate)
        values(@name,@brand,@serial,@cost,@seller,@note,@moneyType,@buyDate)

        select @addedDeviceID =SCOPE_IDENTITY()

        insert into HardDisk(ID,size)
        values(@addedDeviceID,@size) 

        exec DecreaseMoneyFromFund @moneyType,@cost         

    COMMIT           
END TRY
BEGIN CATCH

    IF @@TRANCOUNT > 0
        ROLLBACK
END CATCH

【问题讨论】:

  • 您能否发布调用此存储过程的 C# 代码的相关部分?还有 DecreaseMoneyFromFund 程序在做什么?
  • 能把DecreaseMoneyFromFund的源码公布一下吗?
  • 问题出在 SQL 中,而不是在 C#中

标签: c# tsql transactions


【解决方案1】:

TRAN 的范围是您的 TRY 块,因此在您回滚的 catch 中它不存在。切换它:BEGIN TRAN 然后 BEGIN TRY。

回滚必须发生在事务范围内,而不是之前或之后。修改后的代码:

CREATE PROCEDURE [dbo].[AddHardDisk]
    @name nvarchar(50), @brand nvarchar(50), @serial nvarchar(50), @cost float,  @seller nvarchar(50),@note nvarchar(1000),@buyDate Date,
    @size int ,@moneyType nvarchar(50)

AS

    DECLARE  @addedDeviceID int

 BEGIN TRAN
    BEGIN  TRY   

        insert into Product(Name,Brand,Serial,Cost,Seller,Note,MoneyType,BuyDate)
        values(@name,@brand,@serial,@cost,@seller,@note,@moneyType,@buyDate)

        select @addedDeviceID =SCOPE_IDENTITY()

        insert into HardDisk(ID,size)
        values(@addedDeviceID,@size) 

        exec DecreaseMoneyFromFund @moneyType,@cost         

        COMMIT           
    END TRY
    BEGIN CATCH
        IF @@TRANCOUNT > 0
            ROLLBACK
    END CATCH
END TRAN

【讨论】:

  • 你的平局速度更快。但我更喜欢将 tran 嵌套在我的 try/catch 中
【解决方案2】:

这是我用于 Sp 的 emply shell。我认为您可能错过了“提交 Tran”

 BEGIN TRY ;
  BEGIN TRAN;
        BEGIN          

 --Insert SQL Here
        END
IF @@TRANCOUNT > 0  
COMMIT TRAN ;     
END TRY

BEGIN CATCH ;
  DECLARE @ERROR_MESSAGE  VARCHAR(200) ; 
  DECLARE @ERROR_SEVERITY  INT ;
  DECLARE @ERROR_STATE  INT ;

  SET @ERROR_MESSAGE = ERROR_MESSAGE() ;
  SET @ERROR_SEVERITY = ERROR_SEVERITY() ;
  SET @ERROR_STATE = ERROR_STATE() ;

  RAISERROR ( @ERROR_MESSAGE, -- Message text.
                    @ERROR_SEVERITY , -- Severity.
                    @ERROR_STATE -- State.
                 );

Select @ERROR_MESSAGE

IF @@TRANCOUNT > 0
        ROLLBACK TRAN ;

END CATCH ; 

【讨论】:

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