我正在使用实体管理器创建一个包含本机查询的表,并使用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;
答案 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语句。