开发者社区> 问答> 正文

JAVA回滚机制,求大神指点迷津,小弟在此谢过!报错 

上代码
try {                 // 更改JDBC事务的默认提交方式,默认是true,是自动提交;

                connection.setAutoCommit(false);

                m_hashMap = JsonConvert.JsonToObject(jsonContent, HashMap.class);

                akMxFieldInfoDao1.newFieldMxAndDel(bm, m_hashMap);

                //提交JDBC事务,如果没问题,这时才真正的删除了;

                connection.commit();

                // 恢复JDBC事务的默认提交方式

                connection.setAutoCommit(true);

                int resultInt = 0;

                if (resultInt != 0) {

                    result = new ArrayList<Map<String, Object>>();

                    result.add(m_hashMap);

                } else {

                    return null;

                }

            } catch (SQLException e) {

                //回滚JDBC事务,出现异常,为保证数据完整性,此次操作回滚,不删除;

                connection.rollback();

                e.printStackTrace();

            }
当添加数据发生异常时,执行回滚,不删除数据。但是这里发生SQL异常它还是删除数据,不执行回滚,求大神解答,谢谢了!

展开
收起
kun坤 2020-06-03 13:03:18 486 0
1 条回答
写回答
取消 提交回答
  • rollback里面有这样一句注释。This method should be used only when auto-commit mode has been disabled。 ######解决了,我在DAO里又写了一次事务,我把它去掉,然后只在service层写就可以了。谢谢各位大侠的回答!######回复 @kycp1 : connection.setAutoCommit(true); 上面这段代码删掉。 可能是你Dao里面还没有执行到删除就抛出异常了######我把它设为手动提交了,但还是没用######

    int resultInt = 0; if (resultInt != 0)

    你这个意义何在

    ######没什么意义######

    rollback()
    也是要抛出异常的方法,为什么我没看到你捕获,难道整体还要往外面抛出异常?

    ######回复 @kycp1 : 哪里抛的,回滚的时候?######catch (SQLException e) { try { connection.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); } 也抛了,但还是没有回滚。######瞅了半天,木有看到删除的代码在哪...俺觉得你还是自己调试下代码的好,你都说sql异常,他怎么会做数据库操作...感觉逻辑上就说不通,或者你描述的就是有问题的/不完整的######回复 @kycp1 : 我当然知道你的删除代码在那个方法里,但你有说那个方法的connection对象是如何获取的?里面的逻辑是如何的?异常在哪抛出来的?你都没说啊...问问题还要回答的人挖掘需求那也是太辛苦了######akMxFieldInfoDao1.newFieldMxAndDel(bm, m_hashMap); 删除在这里面,已经封装了bm就是删除的ID,m_hashMap是添加数据######建议 去好好理解事物的概念  。。###### 这代码写得太感人...
    你添加出问题了的代码是在事务已经提交之后了,这个时候事务已经结束, 其后的rollback因为不在事务中是没有任何作用的... ######回复 @kycp1 : 最简单的办法, 把commit那句放到catch上的最后一行...######回复 @kycp1 : 缩小事务涉及的范围, 分离出来事务无关的代码...######那我该什么办?把事务提交设为默认?

    2020-06-03 14:27:22
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载