2017-10-31 18 views
0

SELECT FOR UPDATEを使用してデータベースからオブジェクトへのロックを取得する状況があります。これは、複数のテーブルから順序どおりの方法でレコードを挿入および削除するために必要です。この機能は、このように機能します。大きなトランザクションでの行ロック競合の問題

ログイン - >一意のロックオブジェクトをロックし、複数のテーブルにレコードを挿入し、ロックを解除する - >ログアウト - >同じ一意のロックオブジェクトをロックし、複数のテーブルからレコードを削除してロックを解除する。

ログアウトする前にログインしたユーザーを追跡するための同期が有効になっています。 Javaコードでは注意が必要です。しかし、データベースレベルで別のロックを取得して、多数のユーザーがログインしているときにデータベーストランザクションが同期されるようにします。

問題:システム全体がマルチクラスタサーバーとシングルトンサーバーで完全に機能します。ただし、同時ユーザー数が4000以上になると、データベースにはrow lock contention(モード6)が表示されます。ログインできるユーザーはほとんどいません。

目的:ユーザーがログインして正常にログアウトできるように、ロック機構を修正します。

これまでに試したことがあります:NOWAITSKIP LOCKEDからSELECT FOR UPDATEというクエリが追加されました。これは私の問題を解決しません。なぜなら最初のものは単にエラーをスローし、2番目のものは基本的に同期に影響するロックをスキップするからです。

この問題を解決するには、データベースの専門家からの提案や意見が必要です。 TIA。

更新:もう1つの情報を追加するだけです。ロックされた行は更新も何もしません。私たちが行う他のデータベースタスクを同期するためのメカニズムとして使用されています。

+0

dbaのための特別なスタックエクスチェンジコミュニティがあります:-)(dba.stackexchange.com) – GhostCat

+0

ありがとうございました。あまりにもそれを投稿します:) – NaveenBharadwaj

答えて

0

悲観的なロック(現在の方法)に頼る代わりに、おそらくORMを使用してオプティミスティックロックを使用します。

+0

あなたは基本的な説明を提供できますか?私は楽観的なロックについて読んだ。基本的にSELECT FOR UPDATEの代わりにUPDATEを使用する方法について説明します。また、並行処理を別々に処理するために、いくつかのステップを実行する必要があります。 おそらく、あなたはいくつかのブログ投稿へのリンクを提供することができますか? 返信いただきありがとうございます! – NaveenBharadwaj

+0

これを見てください - https://stackoverflow.com/questions/129329/optimistic-vs-pessimistic-lockingまた、ハイバネートを使用しているものを見てくださいhttps://docs.jboss.org/hibernate/orm/4.0/devguide /en-US/html/ch05.html –

+0

質問の更新をご確認ください。私たちはオブジェクトをロックして更新しません。オブジェクトをロックした後、いくつかのINSERT、DELETE、UPDATE文を実行します。すべてを完了したら、ロックを解除します。 オプティミスティック・ロックは、更新されたレコードのバージョン番号に基づいて動作します。私はその複雑さを感じ、私の場合は可能ではないかもしれません – NaveenBharadwaj

関連する問題