管理対象Beanがあり、EntityManager
を定義したとします。私は、トランザクションがどのように機能し、さまざまな状況でどのように行動するのだろうと思っていました。ドキュメントから、私はflush()
が実際にコミットの遅延を上書きするために使用されていることを理解し、それを即座に行います。ですから、私はdemo
がDBに残っており、demo2
には残っていないと予想していました。しかし、それはすべて(私の理解から)単一の取引とみなされるようです。なぜこうなった?トランザクションの開始と終了を定義するために、なぜ注釈や休止状態のメソッドbegin()
とcommit()
が必要ないのですか?私はここでは異なるものを混乱させていますように私はJTAトランザクションのロールバック
@Stateless
public class Testing {
@PersistenceContext(unitName = "testDB")
private EntityManager em;
public void doSomeWork(){
Demo demo = new Demo();
em.persist(demo);
em.flush();
//some code that makes it crash
Demo demo2 = new Demo();
em.persist(demo2);
em.flush();
}
}
:ここ
はどのよう
flush()
作品に関するいくつかの有用な情報ですか?メソッド呼び出しごとに1つのトランザクションがありますか?お互いに無関係な2つのコールが交互に発生し、2つ目のコールが失敗した場合はどうなりますか。最初もロールバックされますか? – Rakimこれはどのように指定するかによって異なります。デフォルトでは、各メソッドには 'Required'トランザクション属性があります。つまり、存在するトランザクションが存在する場合は、存在しない場合に使用されます。ただし、これを変更するには、javax.ejb.TransactionAttributeアノテーションを使用します。たとえば、新しいトランザクションが作成されるたびに、またはトランザクションをまったく使用しないようにすることができます。 – rapasoft
個々のメソッド呼び出し(Beanの外部からの呼び出し)ごとに新しいトランザクションが必要でした。私はあなたがリンクした文書を読んできましたが、私はそれに本当に精通していません。デフォルト設定で十分でしょうか? – Rakim