使用本机查询在jta事务中“创建表”无法回滚?

时间:2016-11-18 01:49:43

标签: mysql jpa nativequery

我正在使用实体管理器创建一个包含本机查询的表,并使用em.persist()将行插入另一个表。 当创建表的本机查询失败时,我回滚了,但是em.persist()总是成功的。有谁知道答案?

我故意编写错误的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;

1 个答案:

答案 0 :(得分:4)

我不确定我是否理解您的问题,但我认为您想要回滚# I used \\ because python will transfer \x2f to / automatially command="echo -e '\\x2f'" p=process(executable='/home/cmd2',argv= ['/home/cmd2',command]) print (p.readall()) 声明。您无法这样做,因为CREATE TABLE会导致隐式CREATE TABLE并结束交易。

See the documentation for implicit-commit

  

本节中列出的语句(以及它们的任何同义词)隐式结束当前会话中活动的任何事务,就好像您在执行语句之前已完成COMMIT一样。

...

  

InnoDB中的CREATE TABLE语句作为单个事务处理。这意味着来自用户的ROLLBACK不会撤消用户在该事务期间所做的CREATE TABLE语句。