什么是事务? 事务 是一组操作的集合,他是一个可分割的工作单位,这些操作要么同时成功,要么同时失败。 MySQL操作开启事务(一组操作开始前,开启事务):start transaction / begin ;提交事务(这组操作全部成功后,提交事务):commit ;回滚事务(中间任何一个操作出现异常,回滚事务):rllback ; Spring操作注解:@Transactional位置:业务(service)层的方法上、类上、接口上作用:将当前方法交给spring进行事务管理,方法执行前,开启事务,成功执行完毕,提交事务,出现异常,回滚事务 开启事务管理日志 #开启事务管理日志 logging: level: org.springframework.jdbc.support.JdbcTransactionManager: debug 代码示例/* * 删除部门 * */ @Transactional //spring 事务管理 @Override public void delete(Integer id) { //根据id删除部门 deptMapper.deleteById(id); int i =1/0; //模拟异常 //根据部门id 删除部门下的员工 empMapper.deleteByDeptId(id); } //结果:异常,数据回滚。 事务属性默认情况下,只有出现 RuntimeException 才回滚异常。rollbackFor属性用于控制出现何种异常类型,回滚事务。 代码示例/* * 删除部门 * */ @Transactional(rollbackFor = Exception.class) //spring 事务管理 @Override public void delete(Integer id) throws Exception { //根据id删除部门 deptMapper.deleteById(id); //模拟异常 if (true){ throw new Exception("出错了..."); } //根据部门id 删除部门下的员工 empMapper.deleteByDeptId(id); //结果:不论什么异常,数据都会回滚。 } 事务属性事务传播行为:指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。REQUIRED:大部分情况下都是用该传播行为即可REOUIRESNEW:当我们不希望事务之间相互影响时,可以使用该传播行为。比如:下订单前需要记录日志,不论订单保存成功与否,都需要保证日志记录能够记录成功。 代码示例/* * 删除部门 * */ @Transactional(rollbackFor = Exception.class) //spring 事务管理 @Override public void delete(Integer id) throws Exception { try { //根据id删除部门 deptMapper.deleteById(id); int i =1/0; //模拟异常 // if (true){throw new Exception("出错了。。。");} //根据部门id 删除部门下的员工 empMapper.deleteByDeptId(id); } finally { DeptLog deptLog = new DeptLog(); deptLog.setCreateTime(LocalDateTime.now()); deptLog.setDescription("执行了解散部门的操作,此次解散的是"+id+"号部门"); deptLogService.insert(deptLog); } }//我把它理解为事物的嵌套,无论外部事务是否回滚,此事务正常执行 //无论删除部门是否出错,都会进行日志记录 @Transactional(propagation = Propagation.REQUIRES_NEW) @Override public void insert(DeptLog deptLog) { deptLogMapper.insertLog(deptLog); }