springboot框架的事务功能

事务回顾

概念

  • 事务是一组操作集合,它是一个不可分割的工作单位,这些操作要么同时成功,要么同时失败。

操作

  • 开启事务~(一组操作开始前,开启事务):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相关的知识敬请期待

项目链接

黑马程序员项目javaWebjavaWeb开发学习仓库


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值