2016-05-03 20 views
0

管理対象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(); 
    } 
} 

答えて

1

Container managed transactionsのすべてのセッションBeanを使用してトランザクション内で実行デフォルトでは...と感じ。つまり、トランザクションがロールバックする原因となる例外が発生した場合は、demoへの変更もロールバックされます。 「トランザクション内で」指定されている方法https://en.wikibooks.org/wiki/Java_Persistence/Persisting#Flush

+0

:ここ

はどのようflush()作品に関するいくつかの有用な情報ですか?メソッド呼び出しごとに1つのトランザクションがありますか?お互いに無関係な2つのコールが交互に発生し、2つ目のコールが失敗した場合はどうなりますか。最初もロールバックされますか? – Rakim

+0

これはどのように指定するかによって異なります。デフォルトでは、各メソッドには 'Required'トランザクション属性があります。つまり、存在するトランザクションが存在する場合は、存在しない場合に使用されます。ただし、これを変更するには、javax.ejb.TransactionAttributeアノテーションを使用します。たとえば、新しいトランザクションが作成されるたびに、またはトランザクションをまったく使用しないようにすることができます。 – rapasoft

+0

個々のメソッド呼び出し(Beanの外部からの呼び出し)ごとに新しいトランザクションが必要でした。私はあなたがリンクした文書を読んできましたが、私はそれに本当に精通していません。デフォルト設定で十分でしょうか? – Rakim

関連する問題