【发布时间】:2012-01-31 07:52:28
【问题描述】:
我有这样的代码:
class Importer
{
private DatabaseContext m_context;
public: Importer()
{
m_context = new DatabaseContext();
m_context.CommandTimeout = 5400; //This is seconds
}
public bool Import (ref String p_outErrorMsg)
{
List<SomeData> dataToImport = new List<SomeData>();
getSomeData(ref dataTiImport);
bool result = false;
try
{
using(TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TimeSpan(2, 0, 0)))
{ //Two hours timeout
result = importDatas(dataToImport);
if (result == true)
{
scope.Complete();
}
}
}
catch (TransactionAbortedException ex)
{
p_outErrorMsg = String.Format("TransactionAbortedException Message: {0}", ex.Message);
}
catch (ApplicationException ex)
{
p_outErrorMsg = String.Format("ApplicationException Message: {0}", ex.Message);
}
}
bool importDatas(List<SomeData> p_DataToImport)
{
foreach (SomeData data in p_DataToImport)
{ //There can be somehitg about 3000 iterations
if (!importSimpleData(data))
{
return false;
}
return true;
}
}
bool importSimpleData(SomeData p_Data)
{
//creation some object o1
try
{
m_context.objetc1s.InsertOnSubmit(o1);
m_context.SubmitChanges();
}
catch (Exception e)
{
//Error handlig
return false
}
//creation some object o2
o2.id_o1 = o1.id_o1;
try
{
m_context.objetc2s.InsertOnSubmit(o2);
m_context.SubmitChanges();
}
catch (Exception e)
{
//Error handlig
return false
}
//creation some object o3
o3.id_o2 = o2.id_o2;
try
{
m_context.objetc3s.InsertOnSubmit(o3);
m_context.SubmitChanges();
}
catch (Exception e)
{
//Error handlig
return false
}
//creation some object o4
o4.id_o1 = o1.id_o1;
try
{
m_context.objetc4s.InsertOnSubmit(o4);
m_context.SubmitChanges();
}
catch (Exception e)
{
//Error handlig
return false
}
return true;
}
}
如果 List 有 500 条记录,则一切正常。 但是当列表接近 1000 时,我总是例外: TransactionAbortedException.Message = "事务已中止"。
首先我认为超时时间很小,所以我确实介绍了这两行代码: ... m_context.CommandTimeout = 5400; //这是秒(1.5小时) ... using(TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TimeSpan(2, 0, 0))) { //两小时超时 ...
正如您在上面的代码中看到的那样。
同样的异常仍然发生,我错过了什么吗? 我做错了什么? 我必须补充说数据库是远程的(不是本地的)
提前感谢您的帮助!
【问题讨论】:
-
不是只显示异常消息,你能对它做一个完整的 ToString() 吗?然后我们会看到更多信息。
-
目前尚不清楚为什么您拥有外部事务范围 - 如果其中任何一个失败,似乎可以将其全部回滚,但如果这是您想要的,只需提交它们全部作为单一交易?此外,如果您正在批量加载,您可能希望使用 SqlBulkCopy - msdn.microsoft.com/en-us/library/…
标签: c# transactionscope