`

myBatis系列之七:事务管理

阅读更多
myBatis系列之一:搭建开发环境
myBatis系列之二:以接口方式交互数据
myBatis系列之三:增删改查
myBatis系列之四:关联数据的查询
myBatis系列之五:与Spring3集成
myBatis系列之六:与SpringMVC集成


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 ExceptionRuntimeException而不抛出
@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;
}
分享到:
评论
1 楼 陌上君 2016-08-09  
引用
[lis[color=indigo][/color]t]
  • [img][/img]
  • [/list]

    相关推荐

      myBatis系列之五:与Spring3集成

      本篇文章将深入探讨MyBatis系列中的第五个主题——如何将MyBatis与Spring3进行集成,以实现更高效、更灵活的Java企业级应用开发。 MyBatis是一个轻量级的SQL映射框架,它允许开发者将SQL语句直接写在XML配置文件...

      myBatis系列之一:搭建开发环境

      然后,配置MyBatis的核心文件`mybatis-config.xml`,定义数据源、事务管理器以及日志设置。例如: ```xml &lt;property name="url" value="jdbc:mysql://localhost:3306/mydatabase?useSSL=false&amp;...

      mybatis系列一:开发环境搭建

      在本篇中,我们将深入探讨"Mybatis系列一:开发环境搭建"的相关知识,这将包括如何设置一个基于Maven的Mybatis开发环境,以及如何理解并使用Mybatis的核心概念。首先,我们需要明白Mybatis是一个优秀的持久层框架,...

      mybatis-3.4.5

      这个版本是MyBatis系列的一个稳定版本,包含了对先前版本的改进和新特性。 在MyBatis 3.4.5中,开发者可以期待以下关键特性: 1. **动态SQL**:MyBatis的强项之一是其强大的动态SQL支持。你可以直接在XML映射文件...

      Mybatis系列学习源码

      本资源是"Mybatis系列学习源码",适合初学者和有一定经验的开发者深入理解Mybatis的工作原理和实践应用。下面将详细探讨Mybatis的核心概念和关键功能。 1. **SqlSession与Executor** - **SqlSession**:它是...

      Mybatis系列教程Mybatis基本应用共9页.pdf

      【标题】:Mybatis系列教程Mybatis基本应用共9页.pdf 【描述】:这份教程是关于Mybatis基本应用的详细讲解,包含了9页丰富的内容,旨在帮助学习者深入理解和掌握Mybatis这一强大的持久层框架。 【标签】:Mybatis...

      Spring3MVC+MyBatis+ExtJs3整合开发系列之四:角色管理模块

      MyBatis需要配置数据源、事务管理器以及Mapper扫描器。Ext Js 3则需要配置Ajax proxy来与Spring MVC的RESTful API进行通信。 在角色管理模块的实现中,通常会包含以下功能: 1. 角色列表展示:使用GridPanel展示...

      spring3.1MVC+mybatis3.1框架集成及事务,分页使用

      在本文中,我们将深入探讨如何将Spring MVC 3.1与MyBatis 3.1框架集成,并讨论其中涉及的关键技术,如事务管理、分页和JSON数据交换。此外,我们还将简要提及开发环境中使用的工具,如Eclipse 4.3、Maven 3.0.5和...

      Mybatis系列教程Mybatis插件共8页.pdf.z

      6. **插件与事务管理**:讨论插件如何与Mybatis的事务管理机制协同工作,确保数据的一致性。 7. **性能优化**:通过实例展示如何使用插件进行性能优化,比如减少不必要的数据库查询,提高SQL执行效率。 8. **最佳...

      mybatis demo

      - 配置文件(mybatis-config.xml):这是MyBatis的核心配置,包含了数据源、事务管理器和Mappers的定义。 - 映射文件(UserMapper.xml):展示了如何定义SQL语句,如SELECT、INSERT、UPDATE和DELETE,并将它们映射...

      Mybatis notes系列博客配套资源

      - XML 配置文件:定义数据源、事务管理器、映射文件等,是 Mybatis 的全局配置。 - 映射文件(Mapper XML):包含 SQL 语句和结果映射,可以使用参数占位符和动态 SQL。 - 注解配置:在 Java 类上直接使用注解...

      Mybatis系列教程Mybatis源码剖析共15页.pd

      9. **事务管理**:Mybatis支持手动和自动事务管理,通过SqlSession的beginTransaction、commit和rollback方法控制。 10. **插件机制**:Mybatis允许自定义插件拦截Executor、StatementHandler、ParameterHandler和...

      b站up遇见狂神说 系列视频Mybatis 项目源码

      08`、`mybatis-02`、`mybatis-09`、`mybatis-01`、`mybatis-07`:这些文件可能代表了不同章节的源代码或者笔记,按照顺序可能是Mybatis的基础到进阶的各个主题,例如配置、SQL映射文件、动态SQL、事务管理等。...

      走进MyBatis世界之基础入门(二)

      MyBatis是一款优秀的ORM...本章主要内容:MyBatis与Spring如何集成,声明式事务管理,MapperScannerConfigurer本次课程,在YY上进行,YY频道:71042615课程回放:http://bbs.51cto.com/open/do/course/cid/65系列课程:...

      开源框架面试题系列:Spring+SpringMVC+MyBatis

      5. **Spring与MyBatis整合**:解释如何将MyBatis集成到Spring项目中,利用Spring的事务管理。 最后,SpringMVC是Spring框架的Web模块,用于构建MVC架构的Web应用。SpringMVC面试专题可能包含: 1. **请求处理流程*...

      Mybatis系列教程Mybatis注解开发共9页.pdf

      【标题】"Mybatis系列教程Mybatis注解开发共9页.pdf" 提供的是一个关于Mybatis框架注解开发的教程,重点在于讲解如何在Mybatis中使用注解进行数据库操作。Mybatis是一个轻量级的Java持久层框架,它允许开发者通过...

      mybatis笔记.zip

      6. **MyBatis与Spring整合**:在SSM架构中,MyBatis与Spring的整合可以实现事务管理、依赖注入等功能,简化项目开发。 7. **Mapper接口与XML映射文件**:Mapper接口定义业务方法,XML映射文件中定义SQL语句,通过...

      Mybatis系列教程Mybatis架构原理共4页.pdf

      【标题】:Mybatis系列教程Mybatis架构原理共4页.pdf 【描述】:这个压缩文件包含了一份关于Mybatis架构原理的系列教程,总计四页的内容。Mybatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。...

    Global site tag (gtag.js) - Google Analytics