2

私は、データベースとして C# と SQL Server を使用して .NET Web アプリケーションを開発しており、両方のテクノロジの初心者です。同時に多くの情報を保存しようとすると問題が発生します。

私のコードは簡単です:

  SqlConnection cn = null;
  try
  {
    using (TransactionScope scope = new TransactionScope())
    {
      using (cn = Util.getConnection())
      {
        cn.Open();

        BusinessObject.saveObject1(param1, cn);
        BusinessObject.saveObject2(param2, cn);
        BusinessObject.saveObject3(param3, cn);
        BusinessObject.saveObject4(param4, cn);

        ...

        scope.Complete();

      }
    }

エラーが発生した場合、データの変更を取り消す必要があり、プロセスが問題ない場合は同じ動作が必要になるため、常に同じ接続オブジェクトを使用します。

保存のプロセスに時間がかかることは気にしません。多くの情報を保存する必要があるため、私のアプリケーションでは完全に正常です。

ここでの奇妙さは次のとおりです。

  • データベースの同じローカル エリア ネットワークでこの関数を実行すると、完全に機能します。
  • ただし、VPN で接続されているため、レイテンシが高くなるなど、外部から実行すると、「現在の接続に関連付けられているトランザクションは完了しましたが、破棄されていません。トランザクションは、接続を使用して SQL ステートメントを実行できるようになる前に破棄されます。」

web.config の接続文字列を使用してデータベースのタイムアウトを変更しようとしましたが、何も解決しませんでした。また、各 executeNonQuery() ステートメントの後で cn.Dispose() を実行すると、次に接続オブジェクトを使用しようとするとエラーが発生します。

TransactionScope オブジェクトのパラメーターを変更する必要がありますか? これを行う別のより良い方法はありますか?

ありがとうございます。

4

3 に答える 3

2

これはタイムアウトエラーが原因です。はTransactionScope、タイムアウトが発生した場合にトランザクションをロールバックすることを決定する場合があります。

TransactionScopeコンストラクターでタイムアウト値を増やす必要があります。デフォルトの最大値。タイムアウトは10分です。

于 2012-07-15T11:30:35.990 に答える
1

scope.Complete();ブロックの外に移動しconnectionます(MSDNの記事)。

于 2012-07-15T11:33:10.643 に答える
1

関数Timeout = 0に を設定しようとしましたか? Util.getConnection()値 0 は制限がないことを示します。これで作業は確実に完了します。を設定することにより、Timeout = 0すべての長い操作ジョブが完了します。

于 2012-07-15T12:04:56.200 に答える