ホームページ  >  記事  >  複数のスレッドを介して同じ/同様のデータベース操作を同時に実行する解決策はありますか?

複数のスレッドを介して同じ/同様のデータベース操作を同時に実行する解決策はありますか?

WBOY
WBOY転載
2024-02-22 12:31:06651ブラウズ

php エディター Zimo が提供する Java Q&A: 複数のスレッドが同じ/類似のデータベース操作を同時に実行できるようにするソリューションはありますか?開発プロセスでは、データベースを同時に実行する複数のスレッドを効果的に処理する方法が常に大きな注目を集めてきました。この記事では、開発者がこの問題を解決できるように、データベース接続プール、ロック メカニズム、トランザクション処理、その他の方法の使用を含むいくつかの解決策を紹介します。システムのパフォーマンスと安定性を向上させるために、マルチスレッドの同時データベース操作を実装する方法を見てみましょう。

質問内容

Java、Spring Boot、Hibernate を使用して、デッドロックや古いデータ例外を発生させることなく、複数のスレッドが特定の操作を同時に実行できるようにする方法はありますか。

たとえば、自動ツールが同時に 2 回ログインすると、次のいずれかの状況が発生するとします。

    2 つのスレッド (リクエスト) が同時にユーザー レコードを更新するため、デッドロックが発生します (例: ユーザーの最終ログイン日時の保存など)。
  1. あるスレッドが別のスレッドのトランザクションが完了する前にユーザーを更新したため、古いデータの例外が発生しました。
これは、ユーザー ID に同期を追加することで解決できますが、そのようなことは

どこでも 行う必要があり、その結果、パフォーマンスが低下する可能性があり、コードベースがさらに肥大化し、注意を維持することが困難になります。

あるいは、分離レベルを調整することもできます (デフォルト レベルをグローバルに設定できるかもしれません)。これはより良い解決策でしょうか、それとも他の解決策はありますか?

解決策

悲観的ロック。

トランザクションの早い段階で更新が必要な可能性のあるすべての行をロックします。これは、

locking read を使用して行うことができます。 リーリー

1 つのスレッドのみがそれを取得します。他のスレッドは、このスレッドがロックを解放するまで待機します。

その間、ロックを保持しているスレッドは、準備ができたら行を更新できます。

リーリー

それでは、他のスレッドに対して礼儀正しく、

更新後できるだけ早く送信してください。これにより、自動的にロックが解除されます。 リーリー

これにより、キューに入れられた次のスレッドが待機しているロックを取得できるようになります。

ロック読み取りを使用すると、複数の行 (複数のテーブル内の複数の行も含む) をロックできます。

select クエリによってチェックされた行はすべてロックされます。複数のテーブルの行をロックする必要がある場合は、結合などの操作を実行できます。

ロックの取得はアトミックであるため、指定されたロック ステートメントは

すべての 要求されたロックを取得する必要があり、そうでない場合は待機する必要があります。

以上が複数のスレッドを介して同じ/同様のデータベース操作を同時に実行する解決策はありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。