我们编写了一个C#3.5客户端,使用ODP.NET与Oracle数据库(11g)进行通信.
此应用程序具有批处理过程,其中执行长时间运行的任务,在TransactionScope中对数据库进行各种调用.
在我们的开发环境中一切顺利,但在我们的一个客户(拥有大量数据)的UAT环境中,出现两个交替(有时是一个,有时是另一个......)错误:
我们目前使用一天的超时时间进行交易(用于测试目的).
在UAT环境中运行所述进程导致在大约一段时间后停止.10分钟,上面有一个例外,所以没有办法接近超时值.
这是第二个错误的堆栈跟踪片段:
at System.Transactions.TransactionStatePromotedAborted.CreateAbortingClone(InternalTransaction tx)
at System.Transactions.DependentTransaction..ctor(IsolationLevel isoLevel, InternalTransaction internalTransaction, Boolean blocking)
at System.Transactions.Transaction.DependentClone(DependentCloneOption cloneOption)
at System.Transactions.TransactionScope.SetCurrent(Transaction newCurrent)
at System.Transactions.TransactionScope.PushScope()
at System.Transactions.TransactionScope..ctor(TransactionScopeOption scopeOption)
at System.Transactions.TransactionScope..ctor()
at Application.Domain.DataAccess.Oracle.EntityDaoBase`2.SaveItem(TEntity item, EntityReference`1 user)
Run Code Online (Sandbox Code Playgroud)
该过程尝试将项目保存到事务范围内的数据库,但堆栈跟踪显示构造函数被命中为TransactionScope类,这意味着它创建了一个新的TransactionScope.
我到目前为止对吗?
因为我不太了解TransactionScope的内部工作原理,但是当你在范围内调用方法时,它会创建一个新的事务(假设继承自环境事务).
可能是因为我是对的,这个新事务没有继承正确的超时(但是默认的超时),所以嵌套事务会导致这个超时异常?
如果没有,任何想法可能是什么?另外,在环境事务中调用的方法中没有定义嵌套事务.
任何帮助将不胜感激!
编辑1:
该功能的简化代码片段:
public void SomeLengthyBatchProcess()
{
using (var transaction = new TransactionScope(TransactionScopeOption.Required, new TimeSpan(1, 0, 0, 0)))
{
foreach (var item in Items)
{
SaveItemToDB(item);
}
transaction.Complete();
}
}
public void SaveItemToDB(object item)
{ …Run Code Online (Sandbox Code Playgroud)