ホームページ >データベース >mysql チュートリアル >SQL Server にアクセスするマルチスレッド C# アプリケーションでデッドロックを効率的に処理するにはどうすればよいですか?

SQL Server にアクセスするマルチスレッド C# アプリケーションでデッドロックを効率的に処理するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-03 11:23:41823ブラウズ

How Can I Efficiently Handle Deadlocks in Multi-threaded C# Applications Accessing SQL Server?

SQL Server データベース呼び出しを使用したマルチスレッド C# アプリケーション

提供されたコードは、SQL Server データベース操作を実行するマルチスレッド C# アプリケーションを示しています。ただし、使用されるアプローチはパフォーマンスの問題やデッドロックを引き起こす可能性があります。この記事では、タスク並列ライブラリ (TPL) を活用し、デッドロック処理を含む、より効率的で堅牢な実装について説明します。

デッドロック管理

データベースの対話を伴うマルチスレッド アプリケーションを操作する場合、デッドロックは避けられない。それらを予測し、それらを効果的に処理するメカニズムを開発することが重要です。

デッドロックの理由

  • 過剰なスレッド: スレッドの数を制限すると、リソースの競合を防ぐことができます。デッドロックの発生を減らします。
  • 不十分インデックス作成: インデックスが不十分な場合、非選択的なクエリが発生し、その結果、デッドロックの可能性が高まる広範囲のロックが発生する可能性があります。
  • 過剰なインデックス作成: インデックスが多すぎると、オーバーヘッドによりパフォーマンスにも影響します。それらを維持する必要があり、デッドロックのリスクが増加します。
  • 高いトランザクション分離レベル: .NET のデフォルトの「シリアル化可能」分離レベルは同時実行性を制限し、デッドロックが増加する可能性があります。 「Read Committed」などの低い分離レベルにより、この問題を軽減できます。

改善されたマルチスレッド アプローチ

次のアプローチを検討してください:

  1. TPL の利用: TPL は、直感的な構文と並列プログラミングを簡素化します。並列処理の組み込みサポート。スレッド管理が簡素化され、ワー​​クロード分散が最適化されます。
  2. デッドロック再試行: デッドロック再試行メカニズムを組み込むことで、時折デッドロックが発生しても操作が確実に継続されます。 DeadlockRetryHelper クラスは、指定された制限内で操作を再試行することでこれを示します。
  3. パーティション化戦略: 可能であれば、テーブルを複数の個別のデータセットにパーティション化することを検討してください。これにより、複数のスレッドが異なるパーティション上で独立して動作できるようになり、デッドロックが最小限に抑えられます。 SQL Server のパーティショニング機能を使用すると、これを効果的に促進できます。
  4. 分離レベルの最適化: トランザクション分離レベルを調整して、デッドロックを最小限に抑えます。たとえば、データの変更が重要でない場合は、「Read Committed」分離レベルを使用すると同時実行性が向上します。

サンプル コード

次のコードは、推奨されるアプローチを示しています。

using System.Threading.Tasks;
using System.Transactions;
using System.Linq;
using Microsoft.Data.SqlClient;

public class MultiThreadingImproved
{
    public static void Main(string[] args)
    {
        var ids = new int[] { 1, 2, 3, 4, 5 };
        var errors = new List<ErrorType>();

        Parallel.ForEach(ids, id =>
        {
            try
            {
                CalculateDetails(id);
            }
            catch (Exception ex)
            {
                errors.Add(new ErrorType(id, ex));
            }
        });
    }

    public static void CalculateDetails(int id)
    {
        using (var db = new SqlConnection("connection string"))
        {
            db.Open();

            using (var txScope = new TransactionScope(
                TransactionScopeOption.Required,
                new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
            {
                // Query and update operations

                db.SubmitChanges();
                txScope.Complete();
            }
        }
    }

    public class ErrorType
    {
        public int Id { get; set; }
        public Exception Exception { get; set; }

        public ErrorType(int id, Exception ex)
        {
            Id = id;
            Exception = ex;
        }
    }
}

結論

潜在的なデッドロックに対処し、TPL を利用し、調査することによって代替戦略を使用すると、SQL Server データベースと対話するマルチスレッド C# アプリケーションのパフォーマンスと信頼性を強化できます。

以上がSQL Server にアクセスするマルチスレッド C# アプリケーションでデッドロックを効率的に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。