• 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(){
    }


  • 相关阅读:
    常用的排序算法的时间复杂度和空间复杂度
    VMWare虚拟机设置固定IP上网方法
    哈希表的冲突处理方法
    lua ipairs和pairs的区别 .
    NP完全问题
    java+selenium+new——文本框的输入、清空——按钮的单击
    java+selenium+new——操作单选按钮——使用list容器进行遍历
    java+selenium+new——对某个元素进行双击(举例示例操作)
    java+selenium+new——操作单选下拉列表——打印每一个选项——3种方法选中某一个选项——select类
    java+selenium+new——对当前浏览器窗口进行截屏,保存到指定文件夹,并取名
  • 原文地址:https://www.cnblogs.com/soundcode/p/6478277.html
Copyright © 2020-2023  润新知