目录
事务
一组操作的集合,它是一个不可分割的工作单位。
操作主要有三步
1. 开启事务(一组操作开始前,开启事务):start transaction / begin ;
2. 提交事务(这组操作全部成功后,提交事务):commit ;
3. 回滚事务(中间任何一个操作出现异常,回滚事务):rollback ;
Spring事务管理
Transactional注解
在当前这个方法执行开始之前来开启事务,方法执行完毕之后提交事务。如果在这个方法执行的过程当中出现了异常,就会进行事务的回滚操作。
默认情况下,只有出现RuntimeException(运行时异常)才会回滚事务。
@Transactional注解书写位置
方法
当前方法交给spring进行事务管理
类
当前类中所有的方法都交由spring进行事务管理
接口
接口下所有的实现类当中所有的方法都交给spring 进行事务管理
开启事务管理日志
在application.yml配置文件中开启
#spring事务管理日志
logging:
level:
org.springframework.jdbc.support.JdbcTransactionManager: debug
事务进阶
异常回滚的属性:rollbackFor
让所有的异常都回滚,需要来配置@Transactional注解当中的rollbackFor属性,指定出现何种异常类型
@Transactional(rollbackFor={Exception.class})//可以使用数组 //是Exception类型的异常会回滚
事务传播行为:propagation
当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。
在@Transactional注解的后面指定一个属性propagation属性来指定传播行为。
@Transactional(propagation = Propagation.传播属性)
常见的事务传播
REQUIRED【默认值】需要事务,有则加入,无则创建新事务
REQUIRES_NEW需要新事务,无论有无,总是创建新事务
记录日志数据案例
业务实现类中的方法:DeptServiceImpl
//删除部门
try {
deptMapper.delete(id);
//删除对应部门的员工
empMapper.deleteDeptId(id);} finally {
DeptLog deptLog = new DeptLog();
deptLog.setCreateTime(LocalDateTime.now());
deptLog.setDescription("删除部门");
deptLogService.insert(deptLog);
}
DeptLogServiceImpl
@Service
public class DeptLogServiceImpl implements DeptLogService {@Autowired
private DeptLogMapper deptLogMapper;@Transactional(propagation = Propagation.REQUIRES_NEW) //不论是否有事务,都创建新事务 ,运行在一个独立的事务中。
@Override
public void insert(DeptLog deptLog) {
deptLogMapper.insert(deptLog);
}
}