2
回答
数据库事务问题:自带的atom和Tx.class均无法实现
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

@JFinal 你好,想跟你请教个问题:

波总,现在碰到一个复杂的事务处理:

伪代码如下

//更新合作商户账户余额

Partner.dao.update();
//插入订单记录--此步需要订单的自增id;
chargeOrder.save();
//插入账单记录--此步也需要订单的自增id,账单有订单的id作为关联
financeOrder.save();
希望推到model层处理,Tx.class用不了了,该如何处理?

举报
yeti_38
发帖于1年前 2回/158阅
共有2个答案 最后回答: 1年前

确保以下条件成立即可:

1:事务在同一个数据源之下,所以在Tx 拦截之内的代码不能使用Db.use(...)切换到另外的数据源

2:确保是 innoDB 引擎

3:删掉 dao.update() 这样的用法,dao 只能用于查询,这个在手册中有红色字体说明


--- 共有 10 条评论 ---
JFinal回复 @木易大虾 : 用jfinal是为了防止dao=null这被再次赋值,可以不用没多大关系。service中的dao也只能用于查询,dao放在业务层了几乎不会有要XxxService.dao.save()这样做了。controller中的service也可以不用final 1年前 回复
木易大虾回复 @JFinal : 波神我有疑问,为什么service里面定义的这个dao,要用final关键字修饰,不用final关键字修饰可以吗,这个service里面的dao是不是也是只能用于查询呢?我Controller里面的service是不是也要用final关键字修饰? 1年前 回复
木易大虾回复 @JFinal : 好的,谢谢波总,相当nice! 1年前 回复
JFinal回复 @木易大虾 : model只留一点与字段状态相关的方法即可,例如 Account.isStatusOk(): return getStatus() == Account.STATUS_OK; 1年前 回复
JFinal回复 @木易大虾 : dao 写在业务层中,例如 ProjectService 中来一个 private final Project dao = new Project() 就可以了,model中不要写任何业务代码,所有业务转移至业务层中。 1年前 回复
顶部