Lecture21-事务-测试案例

文章目录

    [toc]

    单词词性音标含义
    TRACEn. / v./treɪs/跟踪(日志级别中最低级别,用于记录最详细的程序运行轨迹;也指事务跟踪,记录事务执行过程)
    completingv. (现在分词)/kəmˈpliːtɪŋ/完成(指事务或操作执行完毕的过程,如事务完成前的准备阶段)
    commitv. / n./kəˈmɪt/提交(事务管理中,将所有操作永久保存到数据库的动作,commit()方法用于确认事务执行结果)
    RollBackv. / n./ˈrəʊlbæk/回滚(事务管理中,当操作失败时,将所有已执行操作撤销,恢复到事务开始前状态的动作,rollback()方法用于取消事务执行结果)

    Lecture21-事务-测试案例

    一、创建工程

    环境方面,引入数据源、JdbcTemplate和上个工程一样


    二、案例代码

    1、创建实体类

    image-20250526155310240

    public class Employee {
        private Integer empId;      // 员工ID(主键,自增)
        private String empNo;       // 员工编号
        private String empName;     // 员工姓名
        private Double empSalary;   // 员工工资
        private Date empBirthday;   // 出生日期
        private String phoneNum;    // 手机号
        private Integer deptId;     // 部门ID
        // ……
    

    2、创建Dao

    Dao和Service的分工:

    • Dao中每个方法通常只执行一条SQL语句
    • Service中每个方法对应一个完整的业务逻辑,根据业务逻辑的需求调用Dao的方法

    ① 接口

    image-20250526155347515

    public interface EmpDao {
        void updateEmployee01(Employee employee);
        void updateEmployee02(Employee employee);
    }
    

    ②实现类

    image-20250526155421744

    @Repository
    public class EmpDaoImpl implements EmpDao {
    
        @Autowired
        private JdbcTemplate jdbcTemplate;
    
        @Override
        public void updateEmployee01(Employee employee) {
            String sql = "update t_emp set emp_name=?, emp_salary=? where emp_id=?";
            jdbcTemplate.update(sql, employee.getEmpName(), employee.getEmpSalary(), employee.getEmpId());
        }
    
        @Override
        public void updateEmployee02(Employee employee) {
            String sql = "update t_emp set emp_name=?, emp_salary=? where emp_id=?";
            jdbcTemplate.update(sql, employee.getEmpName(), employee.getEmpSalary(), employee.getEmpId());
        }
    }
    

    3、创建Service

    ①接口

    image-20250526155452578

    public interface EmpService {
    
        void updateTwice();
    
    }
    

    ②实现类

    image-20250526155535445

    @Service
    public class EmpServiceImpl implements EmpService {
    
        @Autowired
        private EmpDao empDao;
    
        public void updateTwice() {
            Employee employee01 = new Employee();
            employee01.setEmpId(1);
            employee01.setEmpName("tom222");
            employee01.setEmpSalary(1111d);
            empDao.updateEmployee01(employee01);
    
            Employee employee02 = new Employee();
            employee02.setEmpId(2);
            employee02.setEmpName("Linda222");
            employee02.setEmpSalary(2222d);
            empDao.updateEmployee02(employee02);
        }
    
    }
    

    4、测试类

    image-20250526155605876

    @SpringBootTest
    class Module31SpringTxApplicationTests {
    
        @Autowired
        private EmpService empService;
    
        @Test
        public void testTx() {
            empService.updateTwice();
        }
    
    }
    

    三、应用事务

    1、添加注解

    @Service
    public class EmpServiceImpl implements EmpService {
    
        @Autowired
        private EmpDao empDao;
    
        @Transactional
        public void updateTwice() {
            Employee employee01 = new Employee();
            employee01.setEmpId(1);
            employee01.setEmpName("tom222");
            employee01.setEmpSalary(1111d);
            empDao.updateEmployee(employee01);
    
            Employee employee02 = new Employee();
            employee02.setEmpId(2);
            employee02.setEmpName("Linda222");
            employee02.setEmpSalary(2222d);
            empDao.updateEmployee(employee02);
        }
    
    }
    

    2、通过日志查看事务是否生效

    image-20250526155737310

    logging.level.org.springframework.transaction.interceptor=TRACE
    

    image-20250526155838479


    3、通过debug源码查看事务是否生效

    • 源码全类名:org.springframework.jdbc.datasource.DataSourceTransactionManager
    • 断点位置:开启事务

    image-20250526160129831

    • 断点位置:提交事务

    image-20250526160211730

    • 断点位置:回滚事务

    image-20250526160238479


    4、查看回滚的情况

    在第二个更新方法中,抛出异常

    @Override
    public void updateEmployee02(Employee employee) {
        String sql = "up333date t_emp set emp_name=?, emp_salary=? where emp_id=?";
        jdbcTemplate.update(sql, employee.getEmpName(), employee.getEmpSalary(), employee.getEmpId());
    }
    
    end