2

2 つのスレッドが同じエンティティを同時に操作すると、OptimisticLockExceptionすべてのデフォルトが適用される場合に がスローされることがわかっています。スレッドが操作したフィールドが注釈@Transientまたは修飾子でマークされていた場合はどうなりtransientますか?

私の直感では、永続化プロバイダーは、一時的なフィールドで何をするか、それらにどのようにアクセスするかについて少しも気にする必要はないと言っています。さらに、アプリケーションで十分に重要であると判断した場合は、同期メカニズムをこれらのフィールドに適用する必要があることもわかります。

ただし、すべての Java EE ブックと JPA 2.0 仕様をグーグル検索しましたが、この「問題」が解決されていません。それは、私がここで何かを見逃しているに違いないこと、そして私が過度に心配していることを示しています??

4

1 に答える 1

2

OptimisticLockException は、エンティティに @Version フィールドがある場合、およびエンティティの状態が読み込まれてから別のトランザクションによって変更されたエンティティをトランザクションが保存しようとした場合にのみ使用されます。

各トランザクションには、ロードする各エンティティの独自のインスタンスがあります。エンティティはスレッド セーフではないため、複数のスレッドで共有することはできません。

実際、一時フィールドは JPA によって完全に無視されます。しかし、各スレッドには独自のエンティティ インスタンスがあるため、同期によって何かがどのように変更されるかはわかりません。さらに、ほとんどのエンタープライズ アプリケーションでは、複数の JVM が同じデータベースを使用するため、同期は役に立ちません。率直に言って、エンティティで一時的なフィールドを使用すると、通常、設計上の問題が発生します。複数のスレッドで共有される状態を保持するために、エンティティの一時的なフィールドの状態に依存することは明らかに間違っています。状態が複数のスレッドまたはプロセスによって共有されている場合は、おそらくデータベースに保存する必要があります。

于 2013-05-03T19:18:18.130 に答える