小さなデータ セットで正常に動作する挿入メソッドがありますが、データ セットが特定のサイズを超えると、最初のトランザクション スコープで設定した内容に関係なく、メソッドがタイムアウトします。
コード内の挿入メソッドは、「ExecuteNonQuery」で呼び出される単純なストアド SQL プロシージャを使用します。
私のコードは次のようになります(綿毛は削除されています):
public void method()
{
using (TransactionScope testScope = new TransactionScope(TransactionScopeOption.Required, new System.TimeSpan(1, 25, 0)))
{
timeDB.insert(var.time);
codeDB.insert(var.code);
foreach (variable var in listOfVariables)
{
nameDB.insert(var.value);
}
testScope.Complete();
}
}
この問題は、スコープのタイムアウトではなくコマンドのタイムアウトに関係していると思います。コードは小さなデータセットで正常に機能するためです....その場合、マシンを変更せずにコマンドのタイムアウトを変更する方法はありますか.config (または他の .config ファイル、値を変更するとプログラムの残りの部分が台無しになるため、それらを変更することは固く禁じられています)
問題が特定のコマンドのタイムアウトではない場合、原因は何ですか? 私が言ったように、コードは8000〜15000の挿入の間のどこでも正常に動作します(接続文字列に設定されたタイムアウトに応じて、プログラム構成ファイルに設定された接続タイムアウト値は、テスト目的でのみ変更できますが、値を変更することはできません)が、それより大きいものはクラッシュします。
また、タスクが約数分後にタイムアウトするため、スコープのタイムアウト値ではないことは間違いありません。トランザクションスコープで設定された1時間25分に近い場所ではありません
この問題を解決するために時間を割いていただき、ありがとうございます。
編集:
要求により、最終的に nameDB.insert メソッドによって呼び出される挿入メソッドの 1 つの例を追加しました (綿毛は削除されました。実際の挿入メソッドは実際には NameDB.insert メソッドのサブメソッドであり、実際のループはそのnameDB.insertメソッドにあります.私はNameDB ....などを使用して毛羽立ちを減らしました.)
public Int32 Insert(Hashtable serData, DataDO data)
{
int numAffected = 0;
IDataParameter[] parameters =
{
this.Helper.GetParameter("@Text", data.Text),
this.Helper.GetParameter("@CreationDt", ((data.CreationDate == DateTime.MinValue)
? Convert.DBNull : data.CreationDate)),
this.Helper.GetParameter("@TypeId", data.TypeId),
this.Helper.GetParameter("@KeyId", DbType.Int32, 4, ParameterDirection.Output)
};
numAffected = this.Helper.ExecuteNonQuery(this.ConnectionString, "InsertData", parameters);
if (numAffected > 0)
return Convert.ToInt32(parameters[parameters.Length - 1].Value);
return 0;
}