【问题标题】:Transaction mismatch in EntityFramework only仅 EntityFramework 中的事务不匹配
【发布时间】:2018-07-05 13:44:15
【问题描述】:

我有一个存储过程

CREATE PROCEDURE [dbo].[GetNextImageRequest]
(...) AS

DECLARE @ReturnValue BIT
SET @ReturnValue = 1

-- Set paranoid level isolation: only one access at a time!
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 
BEGIN TRANSACTION

BEGIN TRY 
    ...
    UPDATE STATEMENT THAT THROWS FOREIGN KEY EXCEPTION           

    IF @@trancount > 0
    BEGIN
        COMMIT TRANSACTION
    END
    SET @ReturnValue = 0
END TRY

BEGIN CATCH
    IF @@trancount > 0
    BEGIN
        ROLLBACK TRANSACTION
    END
    SET @ReturnValue = 1
END CATCH 

SET TRANSACTION ISOLATION LEVEL READ COMMITTED
SET NOCOUNT ON

RETURN @ReturnValue   -- 0=success

GO

当我从 Sql Server Management Studio 手动调用它时,我没有得到任何异常。 当我通过 Entity Framework 6 调用它时,我得到了

EXECUTE 之后的事务计数表示不匹配的数量 BEGIN 和 COMMIT 语句。先前计数 = 1,当前计数 = 0。

我做错了什么?外键约束正在回滚,但我正在检查@@TRANCOUNT。

【问题讨论】:

    标签: entity-framework transactions


    【解决方案1】:

    事实证明 EF6 将 sproc 调用包装在自己的事务中。 解决方法是检查事务是否已打开,如果尚未打开,则仅执行 BEGIN|COMMIT|ROLLBACK TRANSACTION

    【讨论】:

    • 如果你想从存储过程中引发错误但阻止 EF 回滚怎么办?
    【解决方案2】:

    实体框架 6 (EF6) 在 ExecuteSqlCommand 之前添加这一行

    db.Configuration.EnsureTransactionsForFunctionsAndCommands = false;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      • 2020-08-13
      • 1970-01-01
      相关资源
      最近更新 更多