我做了一个设置功能,是一次性全部写入到数据库,具体逻辑是:
以下代码都在事务里面,
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
可以打开 arp.setShowSql(true) 看看执行了哪些 sql
此外, sql 与 sql 之间可能有依赖关系,如果后面的 sql 依赖于前面 sql 产生的新记录,那么在事务中会失败,因为事务需要在所有 sql 执行完后才能提交,而前一个生成记录的 sql 虽然执行了,但没提交,数据没真正生成