开发者社区> 问答> 正文

加了Tx.class 后,事务不回滚? 报错

加了Tx.class 后,事务不回滚? 400 报错

部分代码如下

其中public static final HydLoan dao = new HydLoan();

@Before(Tx.class)
   public void agreementSave() throws Exception{
    try{
     HydLoan hydLoan = HydLoan.dao.getHydLoan(loan_id);
     hydLoanLog.set("ID", Util.getUUID());
     hydLoanLog.set("loan_id", loan_id);
     hydLoanLog.set("user_id", user_id);
     hydLoanLog.set("realname", realname);
     hydLoanLog.set("bf_loan_status", HydContent.FULL_LOAN);
     hydLoanLog.set("result_status", "CURRENT_PASS");
     hydLoanLog.set("audit_remark", "借贷合同签订");
     hydLoanLog.set("ctime", Util.getFormatDate());
     
     hydLoanLog.save();
     
     hydLoan.set("bf_loan_status", HydContent.SECOND_WAIT_ACCOUNTING);
     hydLoan.set("credit_loan_status", HydContent.SECOND_WAIT_ACCOUNTING);
     hydLoan.set("result_status", "CURRENT_PASS");
     hydLoan.set("back_reason", "借贷合同签订");
     hydLoan.set("desc", "借贷合同签订");     
     hydLoan.update();
    }catch(Exception e){

    throw new Exception("出错了");
    

     }

标红的地方,其实数据库中没有该字段,这必然报错,可是第一个表中却成功插入数据了,第2个表中,却没有修改成功,这是为什么哦?为啥事务没有回滚成功呢?

另外数据库引是 innodb

展开
收起
优选2 2020-06-04 21:17:10 827 0
1 条回答
写回答
取消 提交回答
  • 手动捕获异常的时候,要继续抛出,jfinal事务才能继续工作,否则不抛出异常,他会认为这个操作是正确的!

    或者你手动回滚也成:

    DbKit.getConfig().getConnection().rollback();

    ######

    引用来自“aqu”的评论

    手动捕获异常的时候,要继续抛出,jfinal事务才能继续工作,否则不抛出异常,他会认为这个操作是正确的!

    或者你手动回滚也成:

    DbKit.getConfig().getConnection().rollback();

    引用来自“天王盖地虎626”的评论

    可是我抛出异常也没用呀,呜呜
    如果你抛出也没用,如果你手动回滚也无用,,,,,如果你正好用的是mysql,请检查数据库引擎是不是InnoDB ,,,,,mysql默认的主引擎 MyISAM是不支持事务的!######再确认一下 @Before(Tx.class) 是否是用在 Controller 之上的######@Before(Tx.class)注释必须是加载Controller之上的吗?######

    引用来自“aqu”的评论

    手动捕获异常的时候,要继续抛出,jfinal事务才能继续工作,否则不抛出异常,他会认为这个操作是正确的!

    或者你手动回滚也成:

    DbKit.getConfig().getConnection().rollback();

    可是我抛出异常也没用呀,呜呜######

    正确做法是不是去掉try{}catch()就可以了?

    这样异常就会正常抛出

    ######no try catch no throws
    ######如果对事务方面比较关心 可以看下 http://my.oschina.net/idreamblue/blog/388875######

    引用来自“JFinal”的评论

    再确认一下 @Before(Tx.class) 是否是用在 Controller 之上的

    比如我是这样用的:

    @Before(AuthInterceptor.class)

    public class MyCreditManagerAction extends BoxAction {

    @Before(Tx.class)
     public void updateCreditInfo()  throws Exception{

    try{

    。。。

    hydLoanLog.save();

    。。。

    hydLoan.save();

    }catch(Exception e){

    throw new Exception("出错了");

    }

    我目前的情况,类似这样的写法,如果第2个操作数据库出现错误,但是第一个操作数据库正常的话,发现数据保存成功了第一个,却没有一起回滚到初始状态。

    ######注意一下事务级别,调高到 4 ,还要注意一下引擎是否为 InnoDB######

    引用来自“天王盖地虎626”的评论

    引用来自“JFinal”的评论

    再确认一下 @Before(Tx.class) 是否是用在 Controller 之上的

    比如我是这样用的:

    @Before(AuthInterceptor.class)

    public class MyCreditManagerAction extends BoxAction {

    @Before(Tx.class)
     public void updateCreditInfo()  throws Exception{

    try{

    。。。

    hydLoanLog.save();

    。。。

    hydLoan.save();

    }catch(Exception e){

    throw new Exception("出错了");

    }

    我目前的情况,类似这样的写法,如果第2个操作数据库出现错误,但是第一个操作数据库正常的话,发现数据保存成功了第一个,却没有一起回滚到初始状态。

    从图片上看,应该是InnoDB,而且事务级别也是4

    ActiveRecordPlugin arp = new ActiveRecordPlugin("otherConfig",druidPlugin);
    arp.setTransactionLevel(4);但是事务回滚就是没有效果,而且甚至debug了Tx.java类,程序也确实走到了conn.rollback();

    理论上说,我的代码写法应该没有问题,已经起到事务效果了,但是,数据库里数据依然不能保持一致,难不成,数据库这边还有什么要调整吗?

     

     

    2020-06-05 11:32:16
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载