如何在 Entity Framework 6 DbContext.Database.BeginTransaction 中配置事务超时?

Posted

技术标签:

【中文标题】如何在 Entity Framework 6 DbContext.Database.BeginTransaction 中配置事务超时?【英文标题】:How do you configure the Transaction time out in Entity Framework 6 DbContext.Database.BeginTransaction? 【发布时间】:2013-10-23 22:59:22 【问题描述】:

使用类似的代码

using (var tran = Ctxt.Database.BeginTransaction())    

如何设置事务超时值?

【问题讨论】:

【参考方案1】:

如果出于某种原因您需要自己管理事务,使用TransactionScope 会容易得多。它有几个构造函数接受TimeSpan 参数来设置超时。比如

using(var ts = new TransactionScope(TransactionScopeOption.Required,
                                    TimeSpan.FromMinutes(1)))

    using(var ctx = new MyContext())
    
        // Do stuff.
    
    ts.Complete(); // Try - catch to catch TimeoutException

我很好奇你为什么要设置事务超时,而不是命令超时。

【讨论】:

请告诉我实体框架中的默认事务超时是多少? 将 TransactionScope 与 MS SQL Server 一起使用时,我收到以下错误:与当前连接关联的事务已完成但尚未处理。 Oracle 不会发生这种情况。如果我使用 DbContext.BeginTransaction,它适用于两个数据库。【参考方案2】:

我的建议是使用Database.CommandTimeout:

var timeout = 60; //or whatever value you need
Ctxt.Database.CommandTimeout = timeout;
using (var tran = Ctxt.Database.BeginTransaction())

    //do stuff

//this line can be skipped if you're about to dispose context
Ctxt.Database.CommandTimeout = null; //setting back default timeout

当然,你可以很好地将它包装在某个类中。

【讨论】:

CommandTimeout 是针对单个命令的持续时间一个事务范围可以有多个命令因此@GertArnold 答案是正确的 @GertArnold 的回答提供了另一种选择,但从技术上讲,它并没有回答这个问题。

以上是关于如何在 Entity Framework 6 DbContext.Database.BeginTransaction 中配置事务超时?的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework 6 DB-First:仅针对 SQL Server 发出 InvalidOperationException

使用具有多个 DB 模式但使用一个 DBContext 的 Entity Framework 6

使用 Entity Framework 6 创建计算属性

我应该如何在 Entity Framework 6 中播种数据

如何在 Entity Framework 6 中使用 DbDataReader 获取表名?

如何扩展 Entity Framework 6 模型