ホームページ > データベース > mysql チュートリアル > データの整合性を維持しながら SQL Server で INSERT または UPDATE 操作を効率的に実行するにはどうすればよいですか?

データの整合性を維持しながら SQL Server で INSERT または UPDATE 操作を効率的に実行するにはどうすればよいですか?

Barbara Streisand
リリース: 2025-01-22 16:26:10
オリジナル
588 人が閲覧しました

How Can I Efficiently Perform INSERT OR UPDATE Operations in SQL Server While Maintaining Data Integrity?

データの整合性を確保するための SQL Server での INSERT または UPDATE 操作の最適化

データベース アプリケーションでは、SQL Server でのデータの挿入または更新が頻繁に必要になります。 ただし、レコードが既に存在するかどうかの状況を効率的に管理するには、速度とデータの整合性の両方を維持するための慎重な最適化が必要です。

単純なアプローチでは、SQL クエリ内の条件ステートメントを使用して、キーの存在に基づいて更新または挿入を実行します。 ただし、このメソッドは、複数のスレッドが同時に挿入または更新アクションを試行した場合に同時実行性の問題や主キー違反に対して脆弱です。

より信頼性が高く堅牢なソリューションは、トランザクションと行レベルのロックを活用します。 挿入または更新ロジックをトランザクション内に含めることで、アトミック性と一貫性が確保されます。 SERIALIZABLE などの行レベルのロックを使用すると、トランザクション中に他のスレッドが行を変更または削除するのを防ぎます。

BEGIN TRANSELECT FOR UPDATEIF ステートメントを使用したこのアプローチの例を次に示します。

<code class="language-sql">BEGIN TRAN
IF EXISTS (SELECT * FROM MyTable WITH (UPDLOCK, SERIALIZABLE) WHERE KEY = @key)
BEGIN
   UPDATE MyTable SET ... WHERE KEY = @key
END
ELSE
BEGIN
   INSERT INTO MyTable (KEY, ...) VALUES (@key, ...)
END
COMMIT TRAN</code>
ログイン後にコピー

このメソッドはターゲット行への排他的アクセスを保証し、同時更新や主キーの競合を防ぎます。 あるいは、次のアプローチでは、UPDATE@@ROWCOUNT を使用して、同様の結果を実現します。

<code class="language-sql">BEGIN TRAN
UPDATE MyTable WITH (SERIALIZABLE) SET ... WHERE KEY = @key
IF @@ROWCOUNT = 0
BEGIN
   INSERT INTO MyTable (KEY, ...) VALUES (@key, ...)
END
COMMIT TRAN</code>
ログイン後にコピー

どちらの方法も、SQL Server での挿入または更新操作に対する堅牢なソリューションを提供し、データの整合性を保護し、同時実行の問題を軽減します。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート