代码流程

前台点击"提交订单"进入BaseServlet.class

BaseServlet.class分发至子类OrderServlet.class的submitOrder()方法

submitOrder()调用Service层的submitOrder()方法.

关键是Service层submitOrder()中使用了事务回滚. 这里调用了Dao层两个方法: fun01()和fun02(), 其中fun01执行成功, fun02()执行时抛出异常.

catch到异常后, 执行回滚. 然后关闭连接.

然后, 异常诡异的是, 程序并没有在回滚、关闭连接后结束,而是再一次进入BaseServlet。

再一次执行一次上述流程,而这一次,由于第一次已经将线程绑定的连接关闭了。所以自然出现异常:不能操作已经关闭的连接。

我的疑惑是:为什么它走了两次这个流程?是因为我调用了个dao层的插入数据的方法吗?

还是或事物回滚就是从头在执行要一遍流程呢?

这个异常, 导致回滚技术无法实现呀.

代码片段(图片)

代码片段源码

Servlet层

public String submitOrder(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

...

Debug.log("进入方法:submitOrder..."); // 打印信息

boolean flag = false;

// 调用service层方法

flag = orderService.submitOrder( pids, checkeds, quantitys, user );

// 提交成功 --> order_info.jsp页面 失败 --> info.jsp

if( flag ) {

return goOrderInfoUI(req, resp);

}else {

req.setAttribute("error", "提交订单失败!");

return "/info.jsp";

}

}

service层

...

// 获得*线程绑定的连接*

Connection conn = null;

try {

conn = C3P0Util.getConnection();

Debug.log("连接=="+conn);

// 开启事务

// 由于插入要么都成功, 要么都失败, 所以需要用事务操作

Debug.log("进入try");

conn.setAutoCommit(false);

Debug.log("开启事务");

// 调用dao插入数据库

// 插入订单

orderDao.insertOrder(order);

Debug.log("order插入走完");

// 插入订单项

orderDao.insertOrderItmes( orderItems );

// 提交事务

conn.commit();

// 方法返回值为true

Debug.log("事务已提交");

flag = true;

}catch(Exception e) {

Debug.log("进入外层catch");

// 回滚事务

try {

conn.rollback();

Debug.log("事务已回滚");

} catch (SQLException e1) {

// TODO Auto-generated catch block

Debug.log("进入内存catch");

e1.printStackTrace();

}

}finally {

// 关闭连接

try {

Debug.log("关闭连接");

conn.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

Debug.log("service走完");

return flag;

...

注:Debug.log()是自定义方法用来打印信息.

java程序回滚之后在哪看_Java在触发事务回滚之后为什么会再一次回到Servlet开始的地方重新走一次流程?...相关推荐

  1. Java程序员的专属社区 |【Java程序员大本营】新人必看玩转攻略

    "一个人走的快,一群人走的远" 这是Java程序员专属社区创立的初衷. [Java程序员大本营]是面向工作1-3年,希望提升专业技术能力的Java 开发者建立, 致力于Java知识 ...

  2. java: 程序包com.alibaba.fastjson不存在_Java开发中的异常

    NO.1 Java.alng.NullPointerException 这个异常大家肯定都经常遇到,异常的解释是 "程序遇上了空指针 ",简单地说就是调用了未经初始化的对象或者是不 ...

  3. java程序员从笨鸟到菜鸟_Java程序员从笨鸟到菜鸟之(十四)Html基础积累总结(上)...

    [新朋友]点击标题下面(↑)蓝色字"Java那些事"关注 [老朋友]点击右上角,转发或分享本页面内容 这是我以前写的<java程序员由笨鸟到菜鸟>系列博客,每天更新一篇 ...

  4. java程序语言设计第三章答案_java语言程序设计课后习题解答张思民第三章

    java语言程序设计课后习题解答张思民第三章 1 第3章 面向对象程序设计基础 [1]什么是 Java 程序使用的类?什么是类库? [解答]:Java 程序的基本单位是类.对象是对事物的抽象,而类是对 ...

  5. java程序员要去学c 吗_java程序员是否要学c++

    如题,我觉得其实有这个必要.可以从几个方面来看,首先我们不说java与c++语言本身的特性.从历史上来看,java和c++就有着比较密切的关系.很多人认为java就是简化版的带虚拟机的c++.这样我们 ...

  6. java程序中的图片与数值关联_Java从图片中读取图片的元数据Exif信息

    一般情况下是java程序读取不到gps等扩展信息的.如果想要解析到里面的信息需要下载一个jar包,metadata-extractor-2.6.4.jar(下载地址: http://code.goog ...

  7. java程序的运行结果依赖操作系统吗_java模拟试卷及答案及解析4

    复习题4 一.选择题 1.在面向对象的方法中,一个对象请求另一个对象为其服务的方式是通过发送( D ) A.调用语句 B.命令 C.口令 D.消息 2.Java语言具有许多优点和特点,下列选项中,哪个 ...

  8. java程序员面试怎么难为面试官_Java程序员面试这些多线程问题你知道吗?

    在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分.所以你应该准备很多关于多线程的问题.在投资银行业务中多线程和并发是一个非常受欢迎的话题,特别是电子交易发展方面相关的.他们会问面试者很 ...

  9. java程序中可以有几个构造方法_java中多个构造方法可以相互引用么?

    这个程序是创造一个矩形并输出它的对角点importjava.awt.Point;classMyRect{intx1=0;intx2=0;inty1=0;inty2=0;MyRect(intx1,int ...

最新文章

  1. 中国出版业,九死一生
  2. UVa - 12617 - How Lader
  3. ubuntu+VsCode+Cmake+eigen 开发eigen应用
  4. CentOS 6.5下利用Rsyslog+LogAnalyzer+MySQL部署日志服务器
  5. Atitit.病毒木马程序的感染 传播扩散 原理
  6. 优秀程序员是怎样提高敲代码的效率?有这些工具就够了!
  7. C 语言经典面试题 —— 宏
  8. 实战build-react(二)-------引入Ant Design(增加)
  9. ARTIF:实时威胁智能识别框架
  10. Python快速转换numpy数组中Nan和Inf的方法
  11. android usb 摄像头 驱动开发,自制USB摄像头硬件的驱动编写_修改UVC
  12. hive drop表恢复手册
  13. 网络抖动多少ms算正常_【求助】acrh17 ping结果最高延时多少ms?算正常
  14. 瑞盟485/422接口电路MS2576完全替代AM26C31
  15. flstudio软件怎么设置中文语言切换?
  16. 解决docker启动错误 error creating overlay mount to /var/lib/docker/overlay2
  17. codeforces 1238
  18. java页面正文提取_Crux 是一个 HTML 正文内容提取库,并确定一篇文章的关键内容...
  19. Loopback 录屏和录音频(Mac录屏教程/录视频教程/Loopback 教程)
  20. 解决报错dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.62.dylib

热门文章

  1. 机器学习和人工智能的初学指南
  2. 赠书 | IoT 的真正目标是什么
  3. SOA为什么不“香”了? | 大咖说中台
  4. 建议看 | 计算机网络核心概念
  5. 前端性能——数据持久化
  6. 请结合计算机硬件论述指令执行的过程,【计算机组成原理】计算机软硬件组成...
  7. python学习list_python学习之list
  8. 阿里云大学python_阿里云大学「学习路线」,一站式从入门到高手——Python、Java、前端、运维、数据库、云原生……...
  9. 计算机模拟数学实验动画,计算机图形学实验-简单动画的实现、三维图形变换.docx...
  10. android获取版本号报错,Android开发:获取安卓App版本号的方法步骤