事务以及事务的特性
- 事务:若干个SQL操作的整合单元,这些操作要么全部执行,要么全部不执行
- 事务的ACID特性
- Atomicity:原子性——不可分的整体,要么成功,要么回滚
- Consistency:一致性——事务由提交前的一致性状态
- Isolation:隔离性——事务之间互不影响
- Durability:持久性——事务一旦提交,永久保存
实现回滚的步骤
- 开启事务配置:这一步是必要的,笔者由于也是第一次实现事务回滚这个功能,开始直接使用@Transactional 注解,结果当然是无法回滚…摸索了很久才发现没有配置…
- 使用@Transactional注解:只对public方法有效!!!
- 抛出RuntimeException异常交由上层处理
【注】可能有多种实现方式,这里仅说明笔者采用的方式。
1.开启事务配置
<!-- 启用事务配置 -->
<bean id="appTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven proxy-target-class="false" transaction-manager="appTransactionManager" />
2.使用@Transactional 注解
Service层方法
@Transactional
public ReturnType methodName(ParamType param) throws Exception {
actionA(); //执行动作A
...
if(condition){
//抛出异常,事务回滚,即动作A撤销,动作B不执行
throw new RuntimeException("xxxxxxx");
}
...
actionB();
return xxx;
}
抛出的RuntimeException异常交给Controller层处理
@RequestMapping("xxxxxx")
@ResponseBody
ReturnType xxxxxx(ParamType param)throws Exception{
...
try {
res = xxxService.methodName(param);
//对返回的结果进行处理
...
} catch (Exception e) {
//捕获异常,进行处理
...
return ...
}
return ...
}