2

私は本当に休止状態に腹を立てています!

カテゴリのツリーを構築できる親子関係を保持するデータベース テーブル (mysql) があります。取得しようとする複数のスレッドがあり、そこにない場合はカテゴリ パスを作成します (いくつかの親子行が暗示されます) ほぼ同時に。

問題は、私が TRANSACTION_READ_COMMITTED のみを使用していることです。そのため、スレッドが見つからなかったためにカテゴリ サブパスの親子を作成できる競合状態が発生し、(lo!) 別のスレッドがこれを同時。この問題を解決するために、親/子 ID に一意の制約を設定し、完全なカテゴリ パスに一意の制約を設定しました。次に、自分のセッションで休止状態の ConstraintViolationException をキャッチすることを望み、別のスレッドが新しい関係を書き込んだことを知って、他のスレッドが catch 句に書き込んだ行をクエリします。そして、セッションで必要なすべてのことを実行して、そのスレッドを続行してみてください。

これは、複数のスレッドが同じ長いカテゴリ パス (いくつかのサブ親子関係行を含む) を同時に取得/作成する作業を行い、一意の制約が確実に行われるという問題を解決するために考えられる唯一の方法です支持した。

しかし、休止状態は ConstraintViolationException でセッションを無効にし、最終的にアサーション例外 (「com.stagirite.bean.Category エントリの ID が null (例外が発生した後にセッションをフラッシュしないでください)」) をスローするため、私の解決策は実行できません。

悲観的ロックを使用せずに、重複する行を作成しない「取得/作成」モデルのアプリケーション全体でこれをどのように解決しますか?

アンディ

4

1 に答える 1

0

データ (自己参照テーブルまたはマーテリアライズされたパス) と対応する休止状態のマッピングをどのようにモデル化したかがよくわからないので、2 つのスレッドが同じことを変更しようとしている部分に答えようとします。休止状態のバージョン管理機能を使用してみましたか。つまり、1 つのスレッドが既にカテゴリを更新している場合、バージョン番号がインクリメントされます。更新を開始したが終了していない可能性がある他のスレッドでは、バージョンの変更とロールバックが表示されます。データモデルを投稿していただけると助かります。

それが役立つことを願っています。

于 2011-04-09T15:17:14.503 に答える