JDBC 事务里执行DDL导致事务强制提交的问题

@JFinal @杜福忠

我这里遇到一个麻烦,使用

Db.use().tx(() -> {
    //先执行第一个更新语句
    Db.update("udpate table set col=值 where id=1");
    //然后执行DDL语句
    Db.use().update("DROP TABLE IF EXISTS tmp_jehz);
    //再接着执行insert或则update,第二第三个更新语句
    Db.update("udpate table2 ...");
    Db.update("insert into table3 ...");
    //然后由于遇到错误,错误检测代码省略,直接return false模拟异常回滚
    return false;
}

以上代码,后面第二第三个更新语句可以回滚,但第一句的update更新就不回滚,直接提交了。

这其实和JFinal无关,我百度了一下,mysql在执行DDL语句的时候,会强制提交DDL之前的所有更新操作。

请问这个问题有好的解决办法没。就是我想要在整个逻辑过程中就算中间执行了DDL语句,如果回滚,也要全部回滚。

当然,我现在能想到的就是把DDL语句全部移动到所有更新操作的最前面。这暂时解决我当下的这一个问题。但我还有其他业务,可能不太好把DDL都写前面,甚至可能没办法把DDL写到最前面。有没有什么办法解决?谢谢了!

评论区

杜福忠

2024-12-07 00:08

DDL操作不支持事务,失败后执行删除呗,硬控

zzutligang

2024-12-07 13:13

@杜福忠 可能是我没描述清楚,DDL无所谓。主要是执行DDL,会让DDL执行之前对数据库的update强制提交,后面如果业务出现错误,要回滚,只能回滚DDL之后的update操作。DDL语句前面对数据库的update操作就不回滚了。

杜福忠

2024-12-07 18:31

@zzutligang 昂,那使用Db.txInNewThread 包裹执行DDL操作就行。DDL操作用的数据库连接是新的,不会影响其他

12120

2024-12-19 16:09

@zzutligang 你吧DDL放事务最后一行执行不就可以啦 ?

热门反馈

扫码入社