[toc]
| 单词 | 词性 | 音标 | 含义 |
|---|---|---|---|
| TRACE | n. / v. | /treɪs/ | 跟踪(日志级别中最低级别,用于记录最详细的程序运行轨迹;也指事务跟踪,记录事务执行过程) |
| completing | v. (现在分词) | /kəmˈpliːtɪŋ/ | 完成(指事务或操作执行完毕的过程,如事务完成前的准备阶段) |
| commit | v. / n. | /kəˈmɪt/ | 提交(事务管理中,将所有操作永久保存到数据库的动作,commit()方法用于确认事务执行结果) |
| RollBack | v. / n. | /ˈrəʊlbæk/ | 回滚(事务管理中,当操作失败时,将所有已执行操作撤销,恢复到事务开始前状态的动作,rollback()方法用于取消事务执行结果) |
Lecture21-事务-测试案例
一、创建工程
环境方面,引入数据源、JdbcTemplate和上个工程一样
二、案例代码
1、创建实体类

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的方法
① 接口

public interface EmpDao {
void updateEmployee01(Employee employee);
void updateEmployee02(Employee employee);
}
②实现类

@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
①接口

public interface EmpService {
void updateTwice();
}
②实现类

@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、测试类

@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、通过日志查看事务是否生效

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

3、通过debug源码查看事务是否生效
- 源码全类名:org.springframework.jdbc.datasource.DataSourceTransactionManager
- 断点位置:开启事务

- 断点位置:提交事务

- 断点位置:回滚事务

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());
}