2016-11-18 5 views
1

私はエンティティマネージャを使用してネイティブクエリを持つテーブルを作成し、em.persist()を使用して別のテーブルに行を挿入しています。 作成テーブルがネイティブのクエリに失敗したとき、私はロールバックしましたが、em.persist()は常に成功しました。JTAトランザクションで "create table"をネイティブクエリで使用するとロールバックできません。

私は間違ったSQLを意図的に書き込んでキャッチしました。ここ

try { 
    tx.begin(); 
    table1 t1 = new table1(); 
    t1.setC1(c1); 
    t1.setC2(c2); 
    EntityManager em = emf.createEntityManager(); 
    em.persist(t1); 
    Query query1= em.createNativeQuery("drop table if exists table2").executeUpdate(); 
    Query query2= em.createNativeQuery("xxxxxxxxxxxxxxxx").executeUpdate(); 
    tx.commit(); 
    rt = true; 
} catch (Exception e) { 
    try { 
     tx.rollback(); 
    } catch (Exception e1) { 
     PUB.log(e, PUB.getLineInfo()); 
    } 
} 

はpersistence.xmlのであり、私はMysql5.6使用しています:私はあなたの質問を理解してかどうかわからないんだけど、私はあなたがCREATE TABLE文をロールバックしたいと思います

@Stateless 
@TransactionManagement(TransactionManagementType.BEAN) 
public class MainSessionBean implements MainSessionBeanRemote { 
    @PersistenceUnit(unitName = "CC2016JPA2") 
    static EntityManagerFactory emf; 
    @Resource 
    UserTransaction tx; 

答えて

4

を。 CREATE TABLEは暗黙的なCOMMITを引き起こし、トランザクションを終了するので、これを行うことはできません。

See the documentation for implicit-commit:あなたはステートメントを実行する前にCOMMITを行っていたかのように

このセクションに記載されているステートメント(そしてそれらの同義語)は、暗黙的に、現在のセッションでアクティブなすべてのトランザクションを終了します。

...

InnoDB内CREATE TABLE文は、単一のトランザクションとして処理されます。つまり、ユーザーからのROLLBACKは、そのトランザクション中にユーザーが作成したCREATE TABLEステートメントを元に戻しません。

+0

本当に私はem.persist(t1)をロールバックしたいと思いますが、それは私が経験したものではありません。 em.persist()はまだ動作します。 – Jianspf

関連する問題