SqlBulkCopy.WriteToServer挂起Thread.Abort被调用但不确定原因

c# dml large-files linq sqlbulkcopy

鉴于:

  • 一个BenchMark课程,让​​我知道什么时候完成了什么。
  • 一个非常大的XML文件(~120MB),已被解析为多个列表

一些代码:

SqlConnection con = null;
SqlTransaction transaction = null;

try
{
  con = getCon(); // gets a new connection object
  con.Open();
  transaction = con.BeginTransaction();

  var bulkCopy = new SqlBulkCopy(con, SqlBulkCopyOptions.Default, transaction)
  {
    BatchSize = 1000,
    DestinationTableName = "Table1"
  };

  // assume that the BenchMark class is working
  b = new BenchMark("Table1");
  bulkCopy.WriteToServer(_insertTable1s.AsDataReader()); // _insertTables1s is a List<Table1>
  b.Complete();
  LogHelper.WriteLogItem(b);

  b = new BenchMark("Table2");
  bulkCopy.DestinationTableName = "Table2";
  bulkCopy.WriteToServer(_insertTable2s.AsDataReader()); // _insertTables2s is a List<Table2>
  b.Complete();
  LogHelper.WriteLogItem(b);

  // etc... this code does a batch insert into about 7 tables all having about 40,000 records being inserted.

  b = new BenchMark("Transaction Commit");
  transaction.Commit();
  b.Complete();
}
catch (Exception e)
{
  transaction.Rollback();

  LogHelper.WriteLogItem(
    LogLevel.Critical,
    LogType.DataProcessing,
    e.ToString());
}
finally
{
  con.Close();
}

问题:

在我的本地开发环境中,一切都很好。当我在云中运行此操作导致它挂起时。使用LogHelper.WriteLogItem方法,我可以观察此过程的进度。我观察它随机挂在特定的桌子上。不会抛出异常,因此不会回滚事务。假设它挂在Table2批量插入上。使用MS SQL Management Studio,我在Table3Table2Table1上运行查询没有问题(这意味着事务已中止?)

由于它挂起,我将重新运行该过程。这次它更早挂起所以我可能得到这样的日志:

7755   Benchmark   LoadXML took 00:00:04.2432816
7756   Benchmark   Table1 took 00:00:06.3961230
7757   Benchmark   Table2 took 00:00:05.2566890
7758   Benchmark   Table3 took 00:00:08.4900921
7759   Benchmark   Table4 took 00:00:02.0000123

......它挂在Table5上(因为BenchMark从未完成)。我再去运行它,其余的日志看起来像:

7780   Benchmark   LoadXML took 00:00:04.1203923

......它现在挂在这里。

如果有帮助,我正在使用rackspace云托管。我以前能够通过删除dbml文件中的所有表并读取它们来解决这个问题,但这次它无法正常工作。我想知道正在处理的数据量是否导致问题?

编辑:此示例中的代码在异步线程中运行。我发现线程正在中止, 原因不明 ,我需要找出解决这个问题的原因。

一般承认的答案

因为这个过程是异步完成的(即一个线程被启动来处理这个),所以线程有一个中止它的问题,这就是为什么我会在代码在不同的地方停滞的奇怪行为。我已经通过同步完成这项任务解决了这个问题(它有效但不理想)。

我想真正的问题是为什么我的线程正在中止,因为我没有在我的任何代码中中止它。我认为这是由于正在处理的数据量,但我可能是错的。

无论哪种方式,我已经解决了我的问题。


热门答案

如果您拥有服务器或数据库的管理员,则可以运行

SELECT * FROM sys.dm_tran_session_transactions

查看当前活动的交易 - 来自Pinal

此外,您可以运行sp_lock以确保没有阻止事务的内容。




许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因