2017-01-30 10 views
1

私はドメインオブジェクトを持っていて、ユーザーのアカウントを表すアカウントを持っています。今私は、アカウントへのアクセスを同期する必要があります。ドメインオブジェクトへのアクセスを同期するためのロックをキャッシュする方法

public void operate(Account account123) 
    synchronized(account123){ 
    } 
} 

アカウントをフェッチするためにHibernateが使用されているとします。複数のセッションが同一のアカウント、つまり複数のオブジェクトとして明示されたアカウント123を取得する可能性があります

account123を操作しようとすると、複数のスレッドが同じアカウントオブジェクトにアクセスすることを確認しますか?

答えて

0

Javaの​​の代わりにデータベースのロックとトランザクションを使用します。あなたは間違った方法で解決策に近づいています。

0

いずれにしても、データベースについて話すときにトランザクションと呼ばれるものが必要です。

つまり、異なるプロセスが並行して実行されず、データの不一致が生じるという保証が必要です。特に層状アプリケーションで

、それを行うための層は、データベース(すなわち、そのようなサービスを提供するデータベースのコア特徴の一つである)です。

また、このようなロジックを上位層に組み込むことも可能です(時には)。それはA)難しく、B)間違ってしまうのがはるかに簡単です。

理想的には、基礎となるデータベースと、このコンポーネントが提供しているメカニズムを調べます。そのメソッドを実行するだけよりも JVMが常にある場合

あなたの現在のコードは動作します - 同期だけ遮断するように、そのJVMプロセス内で動作します。別のJVMはブロックされないため、データの矛盾が発生します。

+0

私はこのように言います:私は、イベントE1上の特定のエンティティに関連して行うメモリ操作のいくつかを持っています。そのエンティティ(A)に対してこれらの操作を実行しているとき、同じエンティティ(A)E2に関連する他のイベントが発生する可能性があります。これでE1とE2の操作を同期させる必要があります。したがって、エンティティAをロックしたいと思います。そのため、エンティティAのロックをキャッシュします。 – user2599052

関連する問題