spring整合mybatis是如何配置事务的?

Posted 左正

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring整合mybatis是如何配置事务的?相关的知识,希望对你有一定的参考价值。

作者:郭无心
链接:https://www.zhihu.com/question/30206875/answer/84675373
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

http://czj4451.iteye.com/blog/2037759
mybatis的事务管理:
一、单独使用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(); // 关闭会话,释放资源
		}
	}
}

测试会发现数据没有被修改

和Spring集成后,使用Spring的事务管理:
 <!-- 数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" lazy-init="true">
    	<property name="driverClassName">
			<value>org.logicalcobwebs.proxool.ProxoolDriver</value>
	</property>
	<property name="url">
		<value>proxool.gcld</value>
	</property>
</bean>

<!-- sessionFactory -->
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	 <property name="configLocation" value="classpath:mybatis-config.xml">
         </property>
	<property name="dataSource" ref="dataSource"/>
</bean>

<!-- 事务管理器 -->  
<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();
	}
}
================================================================================

<bean id="transactionManager"
  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="yourDataSource" />
</bean>
@Transactional
public void blabla(){
}


以上是关于spring整合mybatis是如何配置事务的?的主要内容,如果未能解决你的问题,请参考以下文章

Spring的事务配置+mybatis整合

Spring的事务配置+mybatis整合

spring整合mybatis配置 事务管理

MyBatis与Spring的整合

spring,mybatis 整合 启用tomcat 报错

spring和mybatis整合怎么将事务在service层关闭?使用xml配置