在SSM框架中添加事务

首先在 applicationContext-mybatis.xml 添加一个事务批处理的bean

	<bean class="org.mybatis.spring.SqlSessionTemplate" id="sqlSession">
        <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" />
        <constructor-arg name="executorType" value="BATCH" />
	</bean>
		// 新获取一个模式为BATCH,自动提交为false的session
		// 如果自动提交设置为true,将无法控制提交的条数,改为最后统一提交,可能导致内存溢出
		SqlSession session = sst.getSqlSessionFactory().openSession(ExecutorType.BATCH,false);
		moMapper= session.getMapper(MOMapper.class);
中间写事务内容
	        try {
			for (PDA_JWL_INTERFACE_H in : inList) {
				moMapper.insert(in);
			}
			cc.put("zyh", zyh);
			moMapper.call(cc);
			System.out.println("存储过程执行完毕");
			session.commit();
			//清理缓存,防止溢出
			session.clearCache();
			return true;
		} catch (Exception e) {
			session.rollback();
			return false;
		} finally {
			session.close();
		}





### SSM 框架事务管理的配置方法 在 SSM 框架中,事务管理是通过 Spring 提供的声明式事务功能实现的。以下是关于如何配置事务管理的详细说明: #### 1. 配置数据源和事务管理器 在 `spring-mybatis.xml` 文件中,定义数据源和事务管理器: ```xml <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> ``` 上述配置中,`DataSourceTransactionManager` 是 Spring 提供的事务管理器,用于管理数据库事务[^1]。 #### 2. 启用声明式事务支持 在 Spring 的配置文件中,启用声明式事务支持: ```xml <tx:annotation-driven transaction-manager="transactionManager" /> ``` 此配置允许使用注解来控制事务行为,例如 `@Transactional` 注解。 #### 3. 在 Service 层添加事务注解 在需要事务管理的服务类或方法上添加 `@Transactional` 注解: ```java @Service public class AdminService { @Autowired private AdminMapper adminMapper; @Transactional public void transfer(Admin fromAdmin, Admin toAdmin, double amount) { adminMapper.updateBalance(fromAdmin.getId(), -amount); if (amount > 1000) { throw new RuntimeException("模拟异常"); } adminMapper.updateBalance(toAdmin.getId(), amount); } } ``` 上述代码中,`@Transactional` 注解确保方法中的操作要么全部成功提交,要么全部回滚。如果方法中抛出未捕获的异常,则事务自动回滚[^1]。 #### 4. 配置事务属性(可选) 可以通过 `@Transactional` 注解的参数自定义事务属性,例如传播行为、隔离级别和回滚规则: ```java @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, rollbackFor = Exception.class) public void criticalOperation() { // 关键业务逻辑 } ``` - `propagation`:定义事务的传播行为。 - `isolation`:定义事务的隔离级别。 - `rollbackFor`:指定哪些异常会导致事务回滚。 #### 5. 测试事务管理 编写单元测试验证事务管理是否正常工作: ```java @SpringBootTest public class AdminServiceTest { @Autowired private AdminService adminService; @Test public void testTransfer() { Admin fromAdmin = new Admin(); fromAdmin.setId(1); Admin toAdmin = new Admin(); toAdmin.setId(2); try { adminService.transfer(fromAdmin, toAdmin, 1500); // 触发异常 } catch (Exception e) { System.out.println("事务已回滚"); } // 验证余额是否正确 Assert.assertEquals(1000, adminService.getBalance(1)); Assert.assertEquals(500, adminService.getBalance(2)); } } ``` ### 注意事项 - 确保 `@Transactional` 注解被正确应用到公共方法上,因为私有方法或受保护方法不会触发事务拦截器。 - 如果使用 MyBatis 的 XML 映射文件,请确保 SQL 语句符合事务要求,避免部分更新导致数据不一致。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值