28

Spring javadoc によると@Transactional(propagation = Propagation.SUPPORTS)

現在のトランザクションをサポートし、存在しない場合は非トランザクションで実行します。同じ名前の EJB トランザクション属性に類似しています。

メソッドを非トランザクション的に宣言し、それで完了できるように思われるので、私の質問は次のとおりです。

  • SUPPORTS の伝播が必要な状況にはどのようなものがありますか?
  • サポートの伝播のポイントは何ですか?

SUPPORTS が実際に役立った実際の例 / シナリオを誰か教えてください。

4

3 に答える 3

8

私が考えることができる最も簡単な例は、何らかのコンテンツを JMS サーバーに送信するメソッドです。トランザクションのコンテキストにいる場合は、メッセージをトランザクション スコープに結合する必要があります。しかし、トランザクションがまだ実行されていない場合、1 回限りのメッセージを実行するためだけにトランザクション サーバーも呼び出して開始する必要があるでしょうか。

これらは実装だけでなく API でも宣言できることに注意してください。したがって、そこに置く場合と何も置かない場合でユースケースに大きな違いがない場合でも、API 作成者がトランザクションに含めることができる操作を指定する価値が追加されます。トランザクションに参加しない外部システム。

もちろん、これは JTA コンテキストです。この機能は、トランザクションがリソース ローカルの物理データベース トランザクションに限定されているシステムではあまり実用的ではありません。

于 2013-02-27T19:06:34.650 に答える
4

readOnly=true特にORMが使用されている場合、選択操作でTransactionalフラグと組み合わせて使用​​ できます。

@Transactional(readOnly = true, propagation=Propagation.SUPPORTS)
public Pojo findPojo(long pojoId) throws Exception {
   return em.find(Pojo.class, pojoId);
}

この場合、選択操作を実行するためだけのトランザクションがまだない場合は、新しいトランザクションを作成するための代価を支払わないようにしてください。

ただし、すでにその思考プロセスに参加している場合は、トランザクションの側面をすべて一緒に捨てることを検討することもできます。

public Pojo findPojo(long pojoId) throws Exception {
   return em.find(Pojo.class, pojoId);
}
于 2013-06-09T23:15:20.310 に答える