加入create table语句后事务失效

使用的是MySQL 8.0 InnoDb引擎,JFinal 4.9,在Action增加了@Before(Tx.class)注解,执行的代码如下:

Db.update("update test set name = '123' where id = 1");

Db.update("create table test2 like test");

Db.update("update test3 set name = '345' where id = 1"); //test3表不存在,执行到这一句抛出异常,但第1、2句仍然执行成功,事务失效

如果把这三句SQL用分号合并成一个字符串执行,事务就起作用,分开三句分别执行,事务就失效。

怎么解决这个问题呢?谢谢!

评论区

糊搞

2020-07-01 11:32

把那3条SQL放到下面:
Db.tx(new IAtom() {
public boolean run() throws SQLException {
。。。。。。
}
});
如果成功,说明是你自己将SQL异常处理掉了,而没有抛给JFinal处理。
文档中有事务的说明,仔细看。

JFinal

2020-07-01 12:29

create table 不支持事务,这个不是 jfinal 决定的,是数据库固有的特征

将 create table 从事务中拿出来,单独去对待它

lxhxka

2020-07-09 16:13

mysql中ddl会使事务自动隐式提交