事务管理
事务管理
sql事务是一组操作的集合,他是一个不可分割的工作单位,要么同时成功,要么同时失败
事务的操作
- 开启事务(一组操作开始前,开启事务):
starttransaction/begin; - 提交事务(这组操作全部成功后,提交事务):
commit; - 回滚事务(中间任何一个操作出现异常,回滚事务):
rollback;
@Transactional事务管理注解
- 位置:业务(
service)层的方法上、类上、接口上 - 作用:将当前方法交给spring进行事务管理,方法执行前,开启事务:成功执行完毕,提交事务:出现异常,回滚事务
public class UserServiceImpl implements UserService {
//根据id删除部门数据
@Override
@Transactional //当前方法已经交给spring进行事务管理
public void deleteDeptById(Integer id) {
//删除部门数据
deptMapper.deleteDeptById(id);
//删除部门下的员工
//查找该部门下的员工
List<Emp> empByDeptIdList = empMapper.findEmpByDeptId(id);
//删除该部门下的所有
empByDeptIdList.stream().map(Emp::getId).forEach(empMapper::deleteEmpById);
}
}
spring 事务管理日志开关
# spring 事务管理日志开关
logging:
level:
org.springframework.jdbc.support.JdbcTransactionManager: debug
@Transactional注解中的属性
rollbackFor属性
默认情况下,只有出现 RuntimeException(运行时异常) 才回滚异常。rollbackFor属性用于控制出现何种异常类型,回滚事务。
public class UserServiceImpl implements UserService {
//根据id删除部门数据
@Override
//当前方法已经交给spring进行事务管理
//rollbackFor = Exception.class 表示出现所有异常都回滚
@Transactional(rollbackFor = Exception.class)
public void deleteDeptById(Integer id) {
throw new Exception("测试事务回滚");
----
}
}
propagation属性
propagation属性用于设置事务传播行为- 指的是当一个事物方法被另一个事务方法调用时,这个方法应该如何进行事务控制
属性值
| 属性值 | 含义 |
|---|---|
REQUIRED 默认 | 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务 |
REQUIRES_NEW | 创建一个新的事务,如果当前存在事务,则把当前事务挂起 |
场景
REOUIRED:大部分情况下都是用该传播行为即可。REQUIRES NEW:当我们不希望事务之间相互影响时,可以使用该传播行为。比如:下订单前需要记录日志,不论订单保存成功与公否,都需要保证日志记录能够记录成功。