【发布时间】:2011-08-20 09:41:04
【问题描述】:
如果 machine.config 中不存在“system.transactions”元素,maxTimeout(参见示例)的 machine.config 中的默认值是多少?
<system.transactions>
<machineSettings maxTimeout="??:??:??" />
</system.transactions>
我问这个是因为代码由于以下异常而崩溃,并且似乎与事务超过超时有关,它在 SaveChanges 方法期间崩溃,我收到的异常如下:
The transaction associated with the current connection has completed
but has not been disposed. The transaction must be disposed before
the connection can be used to execute SQL statements.
这是崩溃的代码:
using (TransactionScope transaction = TransactionHelper.CreateTransactionScope())
{
using (EFContext efDBContext = new EFContext())
{
try
{
efDBContext.Connection.Open();
foreach (MyEntity currentEntity in myEntities)
{
//Insertion
}
transaction.Complete();
}
catch (Exception ex)
{
//Inspect current entity
//Get Total Time of the run
//Number of entities processed
}
finally
{
if (esfDBContext.Connection.State == ConnectionState.Open)
esfDBContext.Connection.Close();
}
}
}
这就是我创建TransactionScope的方式:
public static TransactionScope CreateTransactionScope(TransactionScopeOption option = TransactionScopeOption.Required, IsolationLevel isolationLevel = IsolationLevel.ReadCommitted)
{
var transactionOptions = new TransactionOptions()
{
Timeout = TimeSpan.MaxValue,
IsolationLevel = isolationLevel
};
return new TransactionScope(option, transactionOptions);
}
【问题讨论】:
-
几乎没有人知道这一点,但您需要非常小心。您的 machine.config 始终优先:blog.muonlab.com/2011/08/03/… - “...如果您提供大于 machine.config 值的超时,[运行时] 将忽略它并使用 machine.config 之一。静默。没有抱怨,没有警告。”
-
创建具有最大超时时间的
TransactionScope时,请考虑使用TransactionManager.MaximumTimeout而不是TimeSpan.MaxValue(参见stackoverflow.com/a/21935333/7665486)
标签: .net sql sql-server transactions timeout