ホームページ >データベース >mysql チュートリアル >デッドロックを防ぎながら SQL Server で INSERT または UPDATE 操作を効率的に実行するにはどうすればよいですか?

デッドロックを防ぎながら SQL Server で INSERT または UPDATE 操作を効率的に実行するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-22 16:32:09969ブラウズ

How to Efficiently Perform INSERT or UPDATE Operations in SQL Server While Preventing Deadlocks?

デッドロックを回避するための SQL Server での INSERT および UPDATE 操作の最適化

INSERT (KEY、datafield1、datafield2...) のようなテーブルに対する UPDATEMyTable の同時操作を管理するには、多くの場合、「ライブ クエリ」アプローチが必要になります。つまり、既存の行を更新するか、そうでない場合は新しい行を挿入します。存在する。 パフォーマンスとデータの整合性は最も重要な懸念事項です。

単純な「if 存在する場合」メソッドは非効率的であり、マルチスレッド環境では主キー違反が発生しやすくなります。 データの一貫性を保証し、デッドロックを防ぐには、トランザクションベースの戦略が優れています。

方法 1:

<code class="language-sql">BEGIN TRANSACTION
IF EXISTS (SELECT * FROM table WITH (UPDLOCK,SERIALIZABLE) WHERE key = @key)
BEGIN
      UPDATE table SET ...
      WHERE key = @key
END
ELSE
BEGIN
      INSERT INTO table (key, ...)
      VALUES (@key, ...)
END
COMMIT TRANSACTION</code>

方法 2:

<code class="language-sql">BEGIN TRANSACTION
      UPDATE table WITH (SERIALIZABLE) SET ...
      WHERE key = @key

      IF @@ROWCOUNT = 0
      BEGIN
            INSERT INTO table (key, ...) VALUES (@key,...)
      END

COMMIT TRANSACTION</code>

どちらの方法も SERIALIZABLE 分離レベルを利用してデッドロックを排除し、データの整合性を維持します。 これにより、特に複数のスレッドが INSERT または UPDATE 操作を同時に試行する場合に、最適なパフォーマンスが保証されます。 2 つの方法のどちらを選択するかは、特定のパフォーマンス特性とコーディング スタイルの好みによって決まる場合があります。

以上がデッドロックを防ぎながら SQL Server で INSERT または UPDATE 操作を効率的に実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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