事务回顾
概念
-
事务是一组操作集合,它是一个不可分割的工作单位,这些操作要么同时成功,要么同时失败。
操作
-
开启事务~(一组操作开始前,开启事务):start transaction / begin;
-
提交事务~(这组操作全部成功后,提交事务):commit;
-
回滚事务~(中间任何一个操作出现异常,回滚事务):rollback;
Spring 事务管理
案例
-
删除部门后,部门员工也应该被删除。
-
/** * 实现删除部门方法 */ @Override public void delete(Integer id) { deptMapper.deldete(id);//删除部门 empMapper.deleteByDeptId(id); //删除部门后,需要删除该部门的员工信息 }
/** * 根据部门id删除该部门员工 */ @Delete("delete FROM emp where dept_id = #{id}") void deleteByDeptId(Integer id);
-
异常情况(删除部门,未删除员工)
-
解决(@Transactional)
-
@Transactional @Override public void delete(Integer id) { deptMapper.deldete(id);//删除部门 empMapper.deleteByDeptId(id); //删除部门后,需要删除该部门的员工信息 }
-
Spring事务管理日志
-
#开启事务管理日志 logging: level: org.springframework.jdbc.support.jdbcTransactionManager: debug
-
效果
事务进阶
rollbackFor
-
默认情况下,只有出现RuntimeException才会回滚异常。rollbackFor属性用于控制出现何种异常类型,回滚事务
-
//这种情况不会回滚 /** * 实现删除部门方法 */ @Transactional //spring 事务管理注解 @Override public void delete(Integer id) throws Exception { deptMapper.delete(id);//删除部门 // int n = 1/0; //测试事务 if(true){ throw new Exception("测试事务回滚"); } empMapper.deleteByDeptId(id); //删除部门后,需要删除该部门的员工信息 }
//所有异常都回滚 @Transactional(rollbackFor = Exception.class) //spring 事务管理注解(所有异常都回滚)
propagation
-
概述
-
事务传播行为:指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制。
-
案例
-
新建数据库
-
# 日志记录 create table dept_log(id int primary key auto_increment, createtime datetime, description varchar(100));
-
实体类
-
//实体类 package com.testpeople.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.time.LocalDateTime; @Data @AllArgsConstructor @NoArgsConstructor public class DeptLog { private Integer id; private LocalDateTime createtime; private String description; }
-
DeptLogServiceImpl 类(在一个事务中新建一个事务)
-
//DeptLogServiceImpl package com.testpeople.service.impl; import com.testpeople.mapper.DeptLogMapper; import com.testpeople.pojo.DeptLog; import com.testpeople.service.DeptLogService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @Service public class DeptLogServiceImpl implements DeptLogService { @Autowired private DeptLogMapper deptLogMapper; @Transactional(propagation = Propagation.REQUIRES_NEW)//需要新事务(设置事务方式) @Override public void insert(DeptLog deptLog) { deptLogMapper.insert(deptLog); } }
-
日志插入
-
//Mapper package com.testpeople.mapper; import com.testpeople.pojo.DeptLog; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Mapper; @Mapper public interface DeptLogMapper { @Insert("insert into dept_log(createtime,description) values (#{createtime},#{description})") void insert(DeptLog deptLog); }
-
小结
以上是关于事务功能的简单介绍与使用,下面一篇文章将会介绍AOP相关的知识敬请期待
项目链接