1

与えられた:

  • 何かが完了した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 を使用してTable3、でクエリを実行しましたが、問題はTable2ありTable1ませんでした (これは、トランザクションが中止されたことを意味しますか?)

ハングするので、プロセスを再実行します。今回はすぐにハングアップするため、次のようなログが取得される可能性があります。

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

...そして今ここにぶら下がっています。

それが役立つ場合は、ラックスペース クラウド ホスティングを使用しています。過去に、dbml ファイルからすべてのテーブルを削除して再読み込みすることでこれを修正できましたが、今回は機能しません。処理されているデータの量が問題を引き起こしているのでしょうか?

編集:この例のコードは、非同期スレッドで実行されます。スレッドが不明な理由で中断していることがわかったので、この問題を解決する理由を見つける必要があります。

4

2 に答える 2

1

サーバーまたはデータベースの管理者がいる場合は、実行できます

SELECT * FROM sys.dm_tran_session_transactions

現在アクティブなトランザクションを確認するには - Pinalから

さらに、sp_lockを実行して、トランザクションをブロックしているものがないことを確認できます。

于 2011-04-26T21:36:28.570 に答える
1

このプロセスは非同期で行われる (つまり、これを処理するためにスレッドが開始される) ため、スレッドに問題が発生して中止され、コードがさまざまな場所で停止するという奇妙な動作が発生するのはそのためです。このタスクを同期的に完了することでこれを解決しました(機能しますが、理想的ではありません)。

本当の問題は、どのコードでもスレッドを中止していないため、スレッドが中止される理由だと思います。処理されているデータの量が原因だと思いますが、間違っている可能性があります。

いずれにせよ、私は自分の問題を解決しました。

于 2011-04-29T04:39:16.023 に答える