关于声明式事务的问题

在用jfinal声明式事务的时候不能主动回滚,报错是故意的,发现不能回滚是不是哪里写错了!下面是我的代码

@Before(Tx.class)
public void saveTop(EnPtype ptype, EnTop enTop, Ret ret, Integer oldTopID){

    if (ptype.getProID() == null) {
        ptype.save();
    }
    if (oldTopID != null && oldTopID > 0) {
        String sql = "UPDATE en_top SET topstate = ? WHERE topID = ?";
        Db.update(sql, 2, oldTopID);
    }

    String topName = ptype.getPTypeFrom() + "-" + ptype.getPTypeName();

    enTop.setTopName(topName);
    enTop.setProjectType(ptype.getProID());
    enTop.save();

    String[] stageName = {"开始阶段", "施工阶段", "收尾阶段"};
    List<EnTopstage> stageList = new ArrayList<>();
    for (int i = 0; i < stageName.length; i++) {
        EnTopstage topstage = new EnTopstage();
        topstage.setStageName(stageName[i]);
        topstage.setTopID(enTop.getTopID());

        topstage.save();

        stageList.add(topstage);
    }

    String s1 = "s";
    Integer.valueOf(s1);

    List<EnTopnode> topData = (List<EnTopnode>) ret.get("enTopNodeList");

    //保存节点
    for (EnTopnode topnode : topData) {
        String last = topnode.getNodeLast();
        String l = "";

        for (String s : last.split(",")) {
            if (s == "") continue;
            l += topData.get(Integer.parseInt(s)).getNodeID() + ",";
        }

        Integer nodeStage = topnode.getNodeStage()-1;
        if (nodeStage >= 0) {
            topnode.setNodeStage(stageList.get(nodeStage).getStageID());
        }

        topnode.setNodeLast(l);
        topnode.setTopID(enTop.getTopID());

        topnode.save();
    }

    //更新节点 写入后续节点ID
    for (EnTopnode topnode : topData) {
        String next = topnode.getNodeNext();
        String n = "";

        for (String s : next.split(",")) {
            if (s == "") continue;
            n += topData.get(Integer.parseInt(s)).getNodeID() + ",";
        }
        topnode.setNodeNext(n);

        topnode.update();
    }

    List<List<EnTopnodeoption>> option = (List<List<EnTopnodeoption>>) ret.get("option");

    for (List<EnTopnodeoption> list : option) {
        if (list == null) continue;
        for (int i = 0; i < list.size(); i++) {
            EnTopnodeoption topnodeoption = list.get(i);
            Integer nodeID = topnodeoption.getNodeID();
            topnodeoption.setNodeID(topData.get(nodeID).getNodeID());
            topnodeoption.setOpOrder(i);

            topnodeoption.save();
        }
    }

}


评论区

JFinal

2017-09-19 17:44

看一下 jfinal 手册,有关业务层 AOP 的触发方式。 控制层的 AOP 触发是自动的,而业务层不是

lyh061619

2017-09-19 21:23

看清楚手册,声明式事物正确的姿势应该放在控制层,想在业务层放得用.Db.tx().

无聊2356

2017-09-20 09:47

@JFinal @lyh061619 谢谢两位解答

JFinal

2017-09-20 10:26

@无聊2356 业务层事务可以用注解,也可以用 Db.tx(...) 来做,建议用 Db.tx(...)

EATI001

2017-09-24 08:44

@JFinal 曾测试过在业务层用使用注解事物不起作用,请波总明查^_^

JFinal

2017-09-24 10:27

@EATI001 业务层 AOP 触发方式不同,注意看手册

热门反馈

扫码入社