Spring 的事务测试
自以为是
在我的想象当中,以为只要给这个方法注释成@Transactional, 就会处理事务,然而并非我想象的那样,今天测试了下事务,记录下
测试
1.首先建立一个JUnit 类来进行测试第一种方式
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({"classpath*:/applicationContext.xml" }) public class SpringTransTester { @Resource private UserMoneyMapper userMoney; @Transactional public void doInsert() { UserMoney ins = new UserMoney(); ins.setId("2"); ins.setBalance(100.00); userMoney.insert(ins); ins.setId("2"); // ID相同,会抛出异常 ins.setBalance(99.00); userMoney.insert(ins); } @Test public void testTrans() { List<UserMoney> list = userMoney.qryQuick("yangmf"); doInsert(); System.out.println("testTrans"); } }
数据库中插入了一条记录,第二条出现了错误,但是没有进行回滚
百度查了下资料:
通一个类里面如果A方法没有事务,调用带事务B方法,这样B方法的事务会被忽略。
2. 改造下,把事务的方法单独放到Service中
// 注意该类放到Spring能扫描到的地方 @Service public class SpringTransService { @Resource private UserMoneyMapper userMoney; @Transactional public void doInnerInsert() { UserMoney ins = new UserMoney(); ins.setId("2"); ins.setBalance(100.00); userMoney.insert(ins); ins.setId("2"); // ID相同,会抛出异常 ins.setBalance(99.00); userMoney.insert(ins); } public void doInsert() { doInnerInsert(); } }
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({"classpath*:/applicationContext.xml" }) public class SpringTransTester { @Autowired private SpringTransService service; @Test public void testTrans() { service.doInsert(); System.out.println("testTrans"); } }
这样其实和第一种方法一样,由本类的方法来调用事务, 效果和第一个一样, 但是如果在doInsert上面也加上@Transactional,那么事务会起作用(doInnerInsert,的注解可以去掉)
3. 再改造下
// 注意该类放到Spring能扫描到的地方 @Service public class SpringTransService { @Resource private UserMoneyMapper userMoney; @Transactional public void doInsert() { UserMoney ins = new UserMoney(); ins.setId("2"); ins.setBalance(100.00); userMoney.insert(ins); ins.setId("2"); // ID相同,会抛出异常 ins.setBalance(99.00); userMoney.insert(ins); } }
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({"classpath*:/applicationContext.xml" }) public class SpringTransTester { @Autowired private SpringTransService service; @Test public void testTrans() { service.doInsert(); System.out.println("testTrans"); } }
这样可以,插入第二条是出现了一次,记录没有插入进去
4. 再测试下抛出Exception异常
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({"classpath*:/applicationContext.xml" }) public class SpringTransTester { @Autowired private SpringTransService service; @Test // 加上抛出异常 public void testTrans() throws Exception { service.doInsert(); System.out.println("testTrans"); } }
@Service public class SpringTransService { @Resource private UserMoneyMapper userMoney; // 手动抛出异常 @Transactional public void doInsert() throws Exception { UserMoney ins = new UserMoney(); ins.setId("2"); ins.setBalance(100.00); userMoney.insert(ins); ins.setId("3"); // ID不同相同,会抛出异常 ins.setBalance(99.00); userMoney.insert(ins); throw new Exception("测试事务"); } }
异常抛出了,事务没有起作用,数据都存进去了会, 如果把Exception改成RuntimeException,事务会进行回滚,看来异常不能简单的写个Exception。可以继承RuntimeException
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Web前端开发----JS
JavaScript是世界上最流行的编程语言。 这门语言可用于HTML和web,更可广泛用于服务器、PC、笔记本电脑、平板电脑和智能手机等设备。 JavaScript 是脚本语言 JavaScript是一种轻量级的编程语言。 JavaScript是可插入HTML页面的编程代码。 JavaScript插入HTML页面后,可由所有的现代浏览器执行。 JavaScript很容易学习。 JavaScript:写入 HTML 输出 JavaScript:对事件作出反应 Button:按钮的意思 Onclick事件: Alter函数:弹出对话框 JavaScript:改变 HTML 内容 使用JavaScript来处理HTML内容是非常强大的功能 您会经常看到document.getElementByID("some id")。这个方法是HTML DOM中定义的。 DOM(文档对象模型)是用以访问HTML元素的正式W3C标准。 JavaScript:改变 HTML 样式 改变HTML元素的样式,属于改变HTML属性的变种。 HTML中的脚本必须位于与标签之间。 脚本可被放置在HTML页面的和部分中...
- 下一篇
即不充值影视Vip,也不去电影院,为何Python爬虫师是这种人?
Python多线程爬取电资源的迅雷下载地址,可以再写一个迅雷下载程序进去,不过不建议这样,因为这样所占的内存太大了。 也许有些对Python爬虫并不是很了解的朋友,来此看小编的博文得不到收获,那么我先介绍一下爬虫的原理。 无数的网页地址(url)编织成一张网,称之为网络。爬虫工作时会精心选取一些URL作为起点,(Python)从这些起点出发,(学习群)抓(125240963)取并解析所抓取到的页面,将页面中所需要的信息提取出来,同时获得的新的URL插入到队列中作为下一次爬取的起点。这样不断地循环,直到获取你想得到的所有的信息。此Python爬虫程序实现第一步,分析电影天堂网站的首页结构。解析首页地址 提取分类信息在此函数中,第一步就是把网页的html源码下载下来,由XPath解析出其中的菜单分类信息,并创建相应的文件目录。解析每个分类的主页打开所有分类的首页可以看到全部有一个相同的结构,首先解析出包含资源URL的节点,然后将名称和URL提取出来。解析资源地址保存到文件中把提取出来的信息保存到一个文件夹中即可,为了能够提高爬虫程序的运行效率,利用了Python多线程进行抓取,在此为所有的...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- Mario游戏-低调大师作品
- CentOS关闭SELinux安全模块
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Red5直播服务器,属于Java语言的直播服务器
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池