当前位置: 首页 > 知识库问答 >
问题:

EF6将每个存储过程调用包装在它自己的事务中。如何防止这种情况?

钦德佑
2023-03-14

使用SQL服务器分析器进行分析:EF 6使用BEGIN TRANCOMMIT TRAN包装每个存储过程调用。

这不是一个突破性的变化吗?

也许这不仅是一个突破性的变化,而且使得SPs中的任何事务逻辑都不可能,因为我们永远无法使用ROLLBACK TRAN在存储过程中回滚我们的事务(注意:SQL服务器中没有嵌套事务),所以一次回滚回滚到@@TRANCOUNT零。因为我们在事务中,因为EF 6,我们得到了“EXECUTE后的事务计数表示BEGIN和COMMIT语句的数量不匹配。上一个计数=1,当前计数=0。”标准SQL服务器错误。

请不要问我为什么要调用存储过程。我有数百个,它们都使用TRY... COMMIT... CATCH ROLLBACK逻辑。

有什么想法吗,我怎么才能阻止英孚6这样做?

共有3个答案

孙嘉
2023-03-14

正如crokusek所说,您可以设置该标志来禁用SP的事务。

如果您使用的是任何依赖项注入(DI)库,您可以这样设置(我使用的是简单的注入器):

public partial class Startup
{
    public Container ConfigureSimpleInjector(IAppBuilder app)
    {
        var container = new Container();

        // Configure OWIN and Identity Framework
        ...

        // Configure persistence
        container.RegisterPerWebRequest<FakeDbContext>(() =>
        {
            var fakeDbContext = new FakeDbContext();
            fakeDbContext.Configuration.EnsureTransactionsForFunctionsAndCommands = false;
            return fakeDbContext;
        }

        // Register other services
        ...

        container.Verify();

        // For MVC
        DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));

        return container;
     }
}
栾瑞
2023-03-14

在EF 6.1.2中,标志控制行为。将EnsureTransactionsForFunctionsAndCommands设置为false将影响已导入实体的SP(这些SP在内部调用ExecuteFunction()。

 using (SomeEf6Context ctx = NewContext())
 {
     ctx.Configuration.EnsureTransactionsForFunctionsAndCommands = false;
     // Call an imported SP
 }      

该设置不会影响任何SaveChanges()调用。

MSDN链接

黄彬
2023-03-14

EXECUTESQLCOMAND方法的重载阻止了这种行为:

db.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction, sql, parameters);
 类似资料:
  • 我正在使用jdb dubugger,它的问题是在每个捕获到的异常上都会停止,尽管我没有执行任何捕获。。。。声明。在类加载过程中,有数百个: 发生异常:java。io。FileNotFoundException(uncaught)“thread=thread-2-EmulatorEngine”,sun。其他。URLClassPath$JarLoader。ensureOpen(),行=634 bci=

  • 首先,问题陈述:我在我的开发环境中使用Spring-Batch很好。当我将代码移动到生产环境时,我遇到了一个问题。在我的开发环境中,Spring-Batch能够在我们的DB2数据库服务器中创建它的事务数据表。当我们去PROD时,这不是一个选项,因为这是一个只读的工作。 尝试的解决方案: 所以我不知道在这里做什么。我刚到Spring,所以我边走边自学。我对其他解决方案持开放态度,比如内存数据库,但我

  • 问题内容: 我试图在postgres 9.3上使用sql调用函数内的函数。 这个问题与我的另一篇文章有关。 我写了下面的函数。到目前为止,我还没有合并任何类型的save-output(COPY)语句,因此我试图通过创建嵌套函数print-out函数来解决此问题。 以上功能有效。 尝试创建嵌套函数。 调用嵌套函数。 输出 上面给出了这个。但是,当在print_out()中将arg1,arg2替换为’

  • 问题内容: 我有一个需要很多参数的插入存储过程-其中2个是@ FirstName,@ LastName。我还有一个更新存储过程,该过程需要许多参数-其中2个是@ FirstName,@ LastName。 我想做的是,从插入SP内部完成之后,调用更新SP并将其发送给@ FirstName,@ LastName。 我不知道这样做的正确语法;我试过了: 但我认为这是错误的。 有人可以告诉我怎么写这个电

  • 问题内容: 我在任何地方都找不到此答案,但是可以从MySQL中的另一个存储过程调用存储过程吗?我想找回标识值,并在父存储过程中使用它。我们不能再使用FUNCTIONS! 问题答案: 参数应该可以帮助您将值返回给调用过程。基于此,解决方案必须是这样的。

  • 我正在使用Spring Framework进行数据库调用。我有一个更新,涉及调用2个存储过程,每个过程都在执行多个操作。 我在每个SP中分别定义了以下事务管理: 如果我单独调用每个SP,这可以正常工作,但我想在一个事务中完成整个操作,因此如果对第一个SP的调用有效,但对第二个SP的调用失败,它会同时回滚两者。 所以很明显,我需要从sps中删除提交并在Spring端处理它。 目前对于Spring,我