jfinal事务不能正常保存

我做了一个设置功能,是一次性全部写入到数据库,具体逻辑是:

以下代码都在事务里面,

List<Setting> settings;
Db.delete("delete from t_setting ");
Db.batchSave(settings, setting.size());


这样没有问题。

但是:我的Setting里面还有子集合:如:SubSetting,我的代码就是这样的:

List<Setting> settings;
Db.delete("delete from t_setting ");
for(Setting set : settings){
    set.save();
    Db.delete("delete from t_sub_setting");
    for(SubSetting sub : set.getSubSettings()){
        sub.setSettingId(set.getId);
    }

    Db.batchSave(set.getSubSetting(), set.getSubSetting().size());
}

这个时候的SubSetting就不会保存。

我把: Db.delete("delete from t_sub_setting");  注释掉以后就可以了保存了。请问我怎么办?感觉像是:事务提交的时候,先执行了,save(),在执行了delete()一样。 但是我没有子集合的时候又是正常的。


评论区

JFinal

2019-10-25 20:50

这个是细节问题,要细心去调试跟踪

可以打开 arp.setShowSql(true) 看看执行了哪些 sql

此外, sql 与 sql 之间可能有依赖关系,如果后面的 sql 依赖于前面 sql 产生的新记录,那么在事务中会失败,因为事务需要在所有 sql 执行完后才能提交,而前一个生成记录的 sql 虽然执行了,但没提交,数据没真正生成

tuxming

2019-10-25 20:57

打开了的,都执行了的。但是没有数据。

JFinal

2019-10-25 21:00

@tuxming 你去掉事务代码,将事务关闭一下,然后看看结果,看数据生成没有

tuxming

2019-10-25 21:05

结果一样的,sql正常执行了,数据没有保存进去,看来不是事务的问题,是写法有问题了。我的像个办法换种写法

tuxming

2019-10-25 21:09

还真实粗心的问题,那句delete应该放在for循环外面,不好意思,麻烦大佬了。我觉得这个帖子应该删了,别误导别人了。

莫求尽善

2019-10-25 21:28

提一个建议,尽量避免循环中操作数据库

tuxming

2019-10-25 21:31

这个总数据量不大,一共就十几条数据。

热门反馈

扫码入社