2

春の @Transactional アノテーションを使用した 2 つのメソッドがあります。

@Transactional(readOnly = true) 
public ConfigParameter getConfigParameter(String key) { 

@Transactional(readOnly = false) 
public void setConfigParameter(ConfigParameter param) {

readOnly = false は、メソッドが同期されることを意味します。セッターでreadyOnly = falseが設定されている場合、セッターへのアクセスが同期されていることを意味します。

そのような場合、getter も readOnly を true に設定する (同期する) 必要があることに同意しますか。そうしないと、返されたオブジェクトの状態が矛盾するリスクがあるためです。

このクラスを FindBugs でチェックして警告を受け取ったときに、この問題にたどり着きました。

非同期 get メソッド、同期 set メソッド このクラスには、set メソッドが同期され、get メソッドが同期されない、同様の名前の get メソッドと set メソッドが含まれます。get メソッドの呼び出し元は、オブジェクトの一貫した状態を必ずしも認識しないため、これにより、実行時に誤った動作が発生する可能性があります。get メソッドは同期化する必要があります。

4

2 に答える 2

1

Spring@Transactionalセマンティクスと同期は 2 つの完全に異なるものです。セッターにアノテーションを付けても@Transactional(readOnly = false)、メソッドを次のように宣言した場合のように同期されません。

public synchronized void setConfigParameter(ConfigParameter param)

フラグは、基礎となる持続性エンジンへの単純なヒットです。read-onlyヒントは、現在のトランザクションが読み取り専用であることを意味するように、トランザクション マネージャーによって解釈される場合があります。そのため、スレッドがメソッドを実行する方法とは関係ありません。

于 2012-10-23T11:28:49.993 に答える
0

あなたはこれについて正しく考えていないと思います。トランザクション アノテーションは、これらのメソッドには属しません。

于 2012-10-23T11:28:24.610 に答える