2

以下はテーブル構造です

ここに画像の説明を入力

方式

残高 = 元の金額 + 残高(以前)

50=50+0 ID(1)

200=150+50 ID(2)

2 行目に関しては、hibernate session.save();を使用してバランスを更新する方法です。挿入クエリを書き出そうとしましたが、HQL は値による挿入をサポートしていませんが、他のテーブルからの選択をサポートしていることを知りました。

In HQL, only the INSERT INTO … SELECT … is supported; there is no INSERT INTO … VALUES. HQL only support insert from another table. [ソース]

休止状態を使用している場合は、問題I first get the balance of max id of customer 1ありthen pass the balance to the new objectません。

ただし、マルチユーザー環境ではone user get the balance of max id of customer 1、その間other user insert the new row and update the balance. 残高を取得する最初のユーザーは古いbecause when first user transaction geting the balance other user insert new row and update balanceです。この場合、最初のユーザー トランザクションは、2 番目のユーザー トランザクションを更新する前に取得した以前の残高に対して間違った残高を挿入します。

休止状態には、この種の状況を制御する速報機能がありますか?

最新の残高で hibernate session.save() を使用してトランザクションを保存する方法。?

私を更新してください!

4

1 に答える 1

0

テーブルの行を表すエンティティは互いに独立しているため、Hibernate は残高の計算が古いデータに基づいていることを認識できません。

解決策 1 (断然私の好み): データベースで残高を計算し (トリガーを使用)、残高属性を次のようにマークします。

@Generated(値 = GenerationTime.ALWAYS)

書き込み後にエンティティが更新されるようにします。Hibernate とデータベースが残りを処理します。

アプリケーション レベルで残高計算を行う必要がある場合、いくつかの欠点を伴う複数のソリューションが思い浮かびます。

解決策 2: ユーザー トランザクションを使用して、マルチユーザーに依存するデータをコミットしないでください。

保存要求をシリアル化するための何か (キューイング メカニズムなど) を作成します。ユーザーに依存しないトランザクションで処理を行います。

欠点: 残高は db に格納されているため、ユーザーには表示されません (ただし、現在の計算を行っている一時的な「予測残高」が表示される場合があります)。また、より複雑なアプリケーション ロジックとシリアル化によるボトルネックがあります。

解決策 3: (潜在的に) 間違ったデータを書き込む (または空のままにする) - 後で更新する

新しいエンティティで計算に使用するエンティティの ID を保存する場合は、重複 (同じエンティティに基づく残高を持つ 2 つのエンティティ) をチェックして、値を更新できます。

欠点: ソリューション 2 と似ていますが、更新はバックグラウンド タスクで実行できるため、ボトルネックはありません。

解決策 4: データ モデルをリファクタリングして、エンティティ間の依存関係を削除します (書き込み用)。

残高を一時的にすることができます (表示または使用する必要がある場合は計算します)。

欠点: 適度な数のエントリに対してのみ機能し、このデータをデータベースから削除するため、実行したいクエリが妨げられる可能性があります

于 2013-09-03T16:50:54.547 に答える