如何在 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 中播种数据