myBatis之事务管理
1. myBatis单独使用时,使用SqlSession来处理事务:
- public class MyBatisTxTest {
- private static SqlSessionFactory sqlSessionFactory;
- private static Reader reader;
- @BeforeClass
- public static void setUpBeforeClass() throws Exception {
- try {
- reader = Resources.getResourceAsReader("Configuration.xml");
- sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
- } finally {
- if (reader != null) {
- reader.close();
- }
- }
- }
- @Test
- public void updateUserTxTest() {
- SqlSession session = sqlSessionFactory.openSession(false); // 打开会话,事务开始
- try {
- IUserMapper mapper = session.getMapper(IUserMapper.class);
- User user = new User(9, "Test transaction");
- int affectedCount = mapper.updateUser(user); // 因后面的异常而未执行commit语句
- User user = new User(10, "Test transaction continuously");
- int affectedCount2 = mapper.updateUser(user2); // 因后面的异常而未执行commit语句
- int i = 2 / 0; // 触发运行时异常
- session.commit(); // 提交会话,即事务提交
- } finally {
- session.close(); // 关闭会话,释放资源
- }
- }
- }
2. 和Spring集成后,使用Spring的事务管理:
a. @Transactional方式:
在类路径下创建beans-da-tx.xml文件,在beans-da.xml(系列五)的基础上加入事务配置:
- <!-- 事务管理器 -->
- <bean id="txManager"
- class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource" ref="dataSource" />
- </bean>
- <!-- 事务注解驱动,标注@Transactional的类和方法将具有事务性 -->
- <tx:annotation-driven transaction-manager="txManager" />
- <bean id="userService" class="com.john.hbatis.service.UserService" />
服务类:
- @Service("userService")
- public class UserService {
- @Autowired
- IUserMapper mapper;
- public int batchUpdateUsersWhenException() { // 非事务性
- User user = new User(9, "Before exception");
- int affectedCount = mapper.updateUser(user); // 执行成功
- User user2 = new User(10, "After exception");
- int i = 1 / 0; // 抛出运行时异常
- int affectedCount2 = mapper.updateUser(user2); // 未执行
- if (affectedCount == 1 && affectedCount2 == 1) {
- return 1;
- }
- return 0;
- }
- @Transactional
- public int txUpdateUsersWhenException() { // 事务性
- User user = new User(9, "Before exception");
- int affectedCount = mapper.updateUser(user); // 因后面的异常而回滚
- User user2 = new User(10, "After exception");
- int i = 1 / 0; // 抛出运行时异常,事务回滚
- int affectedCount2 = mapper.updateUser(user2); // 未执行
- if (affectedCount == 1 && affectedCount2 == 1) {
- return 1;
- }
- return 0;
- }
- }
在测试类中加入:
- @RunWith(SpringJUnit4ClassRunner.class)
- @ContextConfiguration(locations = { "classpath:beans-da-tx.xml" })
- public class SpringIntegrateTxTest {
- @Resource
- UserService userService;
- @Test
- public void updateUsersExceptionTest() {
- userService.batchUpdateUsersWhenException();
- }
- @Test
- public void txUpdateUsersExceptionTest() {
- userService.txUpdateUsersWhenException();
- }
- }
b. TransactionTemplate方式
在beans-da-tx.xml中添加:
- <bean id="txTemplate" class="org.springframework.transaction.support.TransactionTemplate">
- <constructor-arg type="org.springframework.transaction.PlatformTransactionManager" ref="transactionManager" />
- </bean>
在UserService类加入:
- @Autowired(required = false)
- TransactionTemplate txTemplate;
- public int txUpdateUsersWhenExceptionViaTxTemplate() {
- int retVal = txTemplate.execute(new TransactionCallback<Integer>() {
- @Override
- public Integer doInTransaction(TransactionStatus status) { // 事务操作
- User user = new User(9, "Before exception");
- int affectedCount = mapper.updateUser(user); // 因后面的异常而回滚
- User user2 = new User(10, "After exception");
- int i = 1 / 0; // 抛出运行时异常并回滚
- int affectedCount2 = mapper.updateUser(user2); // 未执行
- if (affectedCount == 1 && affectedCount2 == 1) {
- return 1;
- }
- return 0;
- }
- });
- return retVal;
- }
在SpringIntegrateTxTest类中加入:
- @Test
- public void updateUsersWhenExceptionViaTxTemplateTest() {
- userService.txUpdateUsersWhenExceptionViaTxTemplate(); //
- }
注:不可catch Exception或RuntimeException而不抛出:
- @Transactional
- public int txUpdateUsersWhenExceptionAndCatch() { // 事务性操作,但是外围框架捕获不到异常,认为执行正确而提交。
- try {
- User user = new User(9, "Before exception");
- int affectedCount = mapper.updateUser(user); // 执行成功
- User user2 = new User(10, "After exception");
- int i = 1 / 0; // 抛出运行时异常
- int affectedCount2 = mapper.updateUser(user2); // 未执行
- if (affectedCount == 1 && affectedCount2 == 1) {
- return 1;
- }
- } catch (Exception e) { // 所有异常被捕获而未抛出
- e.printStackTrace();
- }
- return 0;
- }
myBatis之事务管理的更多相关文章
- spring boot配置mybatis和事务管理
spring boot配置mybatis和事务管理 一.spring boot与mybatis的配置 1.首先,spring boot 配置mybatis需要的全部依赖如下: <!-- Spri ...
- Spring Boot -- Spring Boot之@Async异步调用、Mybatis、事务管理等
这一节将在上一节的基础上,继续深入学习Spring Boot相关知识,其中主要包括@Async异步调用,@Value自定义参数.Mybatis.事务管理等. 本节所使用的代码是在上一节项目代码中,继续 ...
- SpringMVC+MyBatis整合——事务管理
项目一直没有做事务管理,这几天一直在想着解决这事,今天早上终于解决了.接下来直接上配置步骤. 我们项目采用的基本搭建环境:SpringMVC.MyBatis.Oracle11g.WebLogic10. ...
- Spring 与 mybatis整合---事务管理
MyBatis与Spring整合前后事务管理有所区别 整合前:通过 session = sessionFactory.openSession(true); //或者是false 设置事务是否自动提交: ...
- Spring+JTA+Atomikos+mybatis分布式事务管理
我们平时的工作中用到的Spring事务管理是管理一个数据源的.但是如果对多个数据源进行事务管理该怎么办呢?我们可以用JTA和Atomikos结合Spring来实现一个分布式事务管理的功能.了解JTA可 ...
- Mybatis-学习笔记(6)Mybatis的事务管理机制
1.什么是事务. 多个数据库原子访问应该被绑定成一个整体,这就是事务.事务是一个最小的逻辑执行单元,整个事务不能分开执行,要么同时执行,要么同时放弃执行. 事务的4个特性:原子性.一致性.隔离性.持续 ...
- SpringBoot 集成MyBatis、事务管理
集成MyBatis (1)在pom.xml中添加依赖 <!-- mybatis的起步依赖.包含了mybatis.mybatis-spring.spring-jdbc(事务要用到)的坐标 --&g ...
- MyBatis+Spring 事务管理
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://kinglixing.blog.51cto.com/34 ...
- Spring Transaction + MyBatis SqlSession事务管理机制[marked]
随机推荐
- C# 处理应用程序减少内存占用
SetProcessWorkingSetSize减少内存占用 系统启动起来以后,内存占用越来越大,使用析构函数.GC.Collect什么的也不见效果,后来查了好久,找到了个办法,就是使用 SetPro ...
- 新冲刺Sprint3(第五天)
一.Sprint介绍 实现商品.服务信息存入数据库,实现商品图片传输(服务器传输),点击商品.服务进入商品.商品详情.商品.服务按此标准建立数据库. 二.Sprint周期 看板: 燃尽图:
- AFNetworking 3.0
AFN 一.什么是AFN 全称是AFNetworking,是对NSURLConnection的一层封装 虽然运行效率没有ASI高,但是使用比ASI简单 在iOS开发中,使用比较广泛 AFN的githu ...
- 观 GT Java语言管理系统的感悟
继上次java系统考核完... 坦白说,我对我自己写的例子还是很满意的,虽说学长们给的评价不高 ,但我一直以为是学长们对我们的要求太高,以他们的眼光在看待我们,所以我对学长们给的评价并没有太过在意,当 ...
- Map练习错误
private Student findStuByNumber(String number) { Student student=null ; for(Stude ...
- python学习之关键字
1.assert 语句形式:assert 布尔表达式[,msg] 解释:assert是检验一个表达式是否为真.若不为真,则触发一个错误. 例如: assert False assert 1==2 as ...
- python ABC
因为项目需要,总是会有各种各样要重命名文件的场合,manual的方法当然不可取,bat的方法又感觉不够强大,所以就从零开始学python,就为了能够自动批量修改文件名,倒腾了一个周六,总算可以了 :) ...
- mybatis——延迟加载
------------------------------------------------SqlMapConfig.xml------------------------------------ ...
- linux 下如何抓取HTTP流量包(httpry)
基于某些原因你需要嗅探HTTP Web流量(即HTTP请求和响应).例如,你可能会测试Web服务器的性能,或者x奥uy调试Web应用程序或RESTful服务 ,又或者试图解决PAC(代理自动配置)问题 ...
- u-boot-2010.09移植(A)
第一阶段 1.开发环境 系统:centOS6.5 linux版本:2.6.32 交叉编译器:buildroot-2012.08 以上工具已经准备好,具体安装步骤不再 ...