使用IAtom完成事务处理,同时进行多条数据的更新,在红色代码部分异常,但是在数据库里面看,前面的更新操作成功了,没有回滚

public boolean updateBoxsAndParentBox(final String[] boxNos,final Integer woId,final Integer userID,final int maxQty,final int actQty,final int perQty,final String parentBoxNo,final String chidBoxType) {

boolean flag=Db.tx(new IAtom() {

@Override

public boolean run() throws SQLException {

    for(String boxNo:boxNos) {

    Record record = new Record();

record.set("BOX_NO", boxNo);

record.set("WO_ID", woId);

record.set("UPDATED_BY", userID);

record.set("UPDATED_TIME", new Date());

record.set("PARENT_BOX_NO",parentBoxNo);

if(!Db.use("mes").update("t_sp_box_no","BOX_NO,WO_ID",record))

return false;

    }

    for(String boxNo:boxNos) {

    boolean flag=false;

Record record = new Record();

record.set("WO_ID", woId);

record.set("UPDATED_BY", userID);

record.set("UPDATED_TIME", new Date());

switch (chidBoxType.charAt(0)) {

case 'S':

record.set("SMALLBOXNO",boxNo);

record.set("MIDDLEBOXNO",parentBoxNo);

flag=Db.use("mes").update("member_card","SmallBoxNo_",record);

break;

case 'M':

record.set("MIDDLEBOXNO",boxNo);

record.set("LARGEBOXNO",parentBoxNo);

flag=Db.use("mes").update("member_card","MiddleBoxNo",record);

break;

}

if(!flag)/*回滚*/

return flag;

    }

  Record parentBox=new Record();

    parentBox.set("BOX_No",parentBoxNo);

    parentBox.set("WO_ID", woId);

    parentBox.set("UPDATED_BY", userID);

    parentBox.set("UPDATED_TIME", new Date());

    if((actQty+perQty)==maxQty) {

    parentBox.set("ISFULL_FLAG",1);

    parentBox.set("PACK_DATE",new Date());

}

    parentBox.set("ACT_BOX_PER_QTY",perQty+actQty);

    if(!Db.use("mes").update("t_sp_box_no","BOX_NO,WO_ID",parentBox))/*回滚*/

    return false;

    else

    return true;

}

});

return flag;

}


评论区

苦逼ITY

2017-09-04 18:55

PS:刚毕业工作2个月,以前没有太多的开发经验,公司开发的项目是用的JFinal框架,网上看是JFinal用这个方法可以实现事务,就照着试了,不知道是哪里有问题,用的JFinal版本是3.1

JFinal

2017-09-04 20:04

@苦逼ITY jfinal 不支持跨数据源的事务,所以,你的 Db.tx(...) 方法决定使用某数据源以后,在方法内部再使用 Db.use(...) 切换到别的数据源上去不会起作用

苦逼ITY

2017-09-05 11:48

@JFinal 谢谢,解决了,实际上是基础不牢固的问题,跨数据源事务概念没有。没说清楚问题,其实这里整个方法使用的是同一个数据源(虽然整个系统是多数据源的),所以直接将Db.tx改为Db.use(dataSourceName).tx()就可以实现事务了,同样也可以使用@Before(Tx.class)和@TxConfig(dataSourceName)的组合。
最开始我犯了一个错误就是,就是使用了上面的方法之后,想当然的以为默认数据库已经自动切换了,在方法里面直接使用Db.update,结果操作了主数据库的表。实际上方法里面也仍然要使用Db.use(dataSourceName).update/delete...use()来指定需要操作的数据源

JFinal

2017-09-05 12:32

@苦逼ITY 文档可能没到位,应该要说明做事务默认是针对主数据源

热门反馈

扫码入社