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

代码流程

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

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

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

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

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

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

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

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

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

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

代码片段(图片)

642aea8453ed6b2dbdc31c43f66406b6.png

代码片段源码

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()是自定义方法用来打印信息.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527609.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java不进入for_为什么阿里巴巴Java开发手册中强制要求不要在foreach循环里进行元素的remove和add操作?...

在阅读《阿里巴巴Java开发手册》时,发现有一条关于在 foreach 循环里进行元素的 remove/add 操作的规约,具体内容如下:错误演示我们首先在 IDEA 中编写一个在 foreach 循环里进行 remove 操作的代码:import java.util.ArrayList;i…

mysql对测试如何_我如何对MySQL进行基准测试?

我目前正在使用MySQL工作台.我希望看到表中行数增加时性能的差异.我想专门测试并比较1000行,10,000行,100,000行,1,000,000行和10,000,000行.那么,是否有任何工具可以让我这样做并提供有关磁盘I / O,内存使用情况,CPU使用率和完成查询的时间的统计信息?解决方法:是.…

JAVA两个视图层_MVC - 管理帐户 . 一个视图有两个局部视图和两个模型

美好的一天!我正在管理帐户页面上,用户可以在其中更改密码和电子邮件 .我有一个管理视图,其中有两个部分视图,更改密码和更改电子邮件 . 这两种都使用两种不同的模型 . 这样做的目的是在同一页面上同时包含更改密码和更改电子邮件…

8086汇编4位bcd码_二进制格雷码与自然二进制码的互换分析

在精确定位控制系统中,为了提高控制精度,准确测量控制对象的位置是十分重要的。目前,检测位置的办法有两种:其一是使用位置传感器,测量到的位移量由变送器经A/D转换成数字量送至系统进行进一步处理。此方法精度高&…

python datetime.datetime 当前_关于datetime:如何让python显示当前时间(东部)

如何让python在东方显示时间?我已经看过了Python文档,但它非常混乱。我使用的是python 3。谢谢。这可能有帮助:stackoverflow.com/questions/117514/…基本上,在内部使用UTC,并在显示时使用pytz转…

软件工程结构化建模的方法和工具_软件工程系列-结构化设计方法2

本系列文章为笔记,内容根据北京大学《软件工程》MOOC 初始化模块结构图精化的启发式规则常见的启发式规则什么叫做“启发式”根据设计准则,从长期的软件开发实践中,总结出来的规则既不是设计目标,也不是设计时应该普遍遵循的原理常…

java四种权限的高低_Java(四种权限修饰符)

/*Java中有四种权限修饰符:public > protected > (default) > private同一个类(我自己) YES YES YES YES同一个包(我邻居) YES YES YES NO不同包子类(我儿子) YES YES NO NO不同包非子类(陌生人) YES NO NO NO注意事项:(default)并不是关键字“…

安全扫描失败无法上传_Apache Solr 未授权上传(RCE)漏洞的原理分析与验证

漏洞简介Apache Solr 发布公告,旧版本的ConfigSet API 中存在未授权上传漏洞风险,被利用可能导致 RCE (远程代码执行)。受影响的版本:Apache Solr6.6.0 -6.6.5Apache Solr7.0.0 -7.7.3Apache Solr8.0.0 -8.6.2安全专家建议用户尽快升级到安全…

php session页面传值,PHP session在页面间传递的问题

PHP session在页面间传递的问题:前提: 使用codeIgniter的框架, 使用PHP自带的session1. 在纯apache服务器上没有问题2. 在Nginx的apache模式下, 独立于codeIgniter框架外的页面无问题3. 在Nginx的apache模式下, 置于codeIgniter框架内的页面, 页面间session的传递有问题, 即一个…

php div边框,CSS自定义边框

3 个答案:答案 0 :(得分:2)边框图像覆盖在元素的顶部,因此即使边框图像是透明的,它仍然会显示其背后元素的颜色。纯CSS解决方案是使用伪元素。首先将div的位置设置为非静态(相对,绝对或固定将起作用)。然后使你的元素绝对并跨越di…

html5怎么改为vue_Vue实战——编程式导航打开新窗口,登录状态本地存储

近日来,我陆续的分享了vue相关的系列文章,以新闻列表项目为载体,实战的方式介绍了vue及其周边的技术。本文承接前文,不断通过项目迭代的方式继续分享vue相关的知识。目前Vue实战系列文章已形成了目录,各位感兴趣的朋友…

php 有子目录,php列出目录中所有子目录的实现代码

/*** 取出指定目录的所有子目录* edit: www.jbxue.com* 2013/10/9*/function listdir($dir){if ($handle opendir($dir)){$output array();while (false ! ($item readdir($handle))){if (is_dir($dir./.$item) and $item ! "." and $item ! ".."){$out…

python转cpp_python转c工具

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! compute.proto # python_out目录指定 xxxx_pb2.py的输出路径,我们指定为. 当前路径# grpc_pytho…

php 变量 换行,php去除换行符的方法小结(PHP_EOL变量的使用)_PHP教程

一个小小的换行,其实在不同的平台有着不同的实现,为什么要这样,可以是世界是多样的。本来在unix世界换行就用/n来代替,但是windows为了体现他的不同,就用/r/n,更有意思的是在mac中用/r。因此unix系列用 /n&…

80端口为什么要备案_搞网站的你,不了解一下共享虚拟主机和备案问题

正文共:1474字 14图,预估阅读时间:4 分钟今天分享的这一切要从域名备案说起。先科普一下,平时我们访问网站都是用域名访问的,通过DNS服务器将域名解析为IP地址(你知道上网时输入的URL是怎么解析成IP地址的吗&#xff1…

订阅号 笔记记录开发 php,微信订阅号开发笔记(五)

1、用户管理//查询所有分组public function queryGroups(){$url "https://api.weixin.qq.com/cgi-bin/groups/get?access_token";$url.$this->getacctoken();$result $this->cget($url);header("Content-type: text/html; charsetutf-8");print_r…

jqprint获取打印页数_高年级应用题40道,假期快给孩子打印练习吧!(含答案)...

1.王爷爷家养的4头奶牛每个星期产奶896千克,平均1头奶牛每天产多少奶呢?2.4辆汽车3次运水泥960袋,平均每辆汽车每次运水泥多少袋?3.水波小学每间教室有3个窗户,每个窗户安装12块玻璃,9间教室一共安装多少块…

cstring移除指定字符串_从String中移除空白字符的多种方式!?差别竟然这么大!...

作者 | Hollis来源 | Hollis字符串,是Java中最常用的一个数据类型了。我们在日常开发时候会经常使用字符串做很多的操作。比如字符串的拼接、截断、替换等。这一篇文章,我们介绍一个比较常见又容易被忽略的一个操作,那就是移除字符串中的空格…

php angular使用,如何使用angular.js PHP从mysql显示数据?

您好,您可以查看以下示例代码你的HTML页面:AngularJs Post Example: DevZone.co.in #dv1{border:1px solid #DBDCE9; margin-left:auto;margin-right:auto;width:220px;border-radius:7px;padding: 25px;}.info{border: 1px solid;margin: 10px 0px;padding:10px;co…

php业务的适用场景,根据业务场景寻找合适解决方案(PHP)?

系统环境:LinuxPHP 7.3ThinkPHP 6先说一下业务场景:订单创建成功之后,每一笔订单都需要进行统计及其他业务处理。如何及时发现处理失败的订单,然后进行补单处理。订单所产生佣金的处理。要解决以上问题,最简单的办法就…