2016-11-18 25 views
1

我正在使用實體管理器來創建具有本機查詢的表,並使用em.persist()將行插入到另一個表中。 當創建表的本機查詢失敗時,我回滾了,但em.persist()總是成功。是否有人知道答案?使用本機查詢來在jta事務中「創建表」不能被回滾?

我寫了一個錯誤的sql,目的是使它成爲catch。

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:

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

回答

4

我不知道如果我理解你的問題,但我認爲要回滾一個CREATE TABLE聲明。你不能那樣做,因爲CREATE TABLE會導致一個隱含的COMMIT並結束該事務。

See the documentation for implicit-commit

在本節(以及他們的任何同義詞)中列出的語句隱含結束當前在當前會話中的任何交易,因爲如果你做了執行該語句之前提交。

...

InnoDB中的CREATE TABLE語句被作爲一個單獨的事務。這意味着來自用戶的ROLLBACK不會撤銷用戶在該事務期間所做的CREATE TABLE語句。

+0

謝謝Baao,其實我想回滾em.persist(t1),但這不是我擅長的。 em.persist()仍然有效。 – Jianspf