1、事务管理器
- 若工程直接或间接依赖于
spring-tx
,则框架会自动注入DataSourceTransactionManager
事务管理器; - 若依赖于
spring-boot-data-jpa
,则会自动注入JpaTransactionManager
。
2、准备
- 数据库
Teacher(id, name, age) - 接口
TeacherDao#insertTeacher:添加teacher记录。
3、使用方法
在需要执行事务的方法上添加@Transactional
注解。
public class DemoClass {
@Transactional
public void demoFunc(...) {
...
}
}
4、事务处理方式
4.1、发生运行异常时事务回滚
当程序发生运行异常时,SpringBoot事务默认回滚:
@Service
public class TeacherServiceImpl implements TeacherService {
@Autowired
private TeacherDao dao;
@Transactional
@Override
public void addTeacher(Teacher teacher) {
dao.insertTeacher(teacher); // #1
int i = 1 / 0; // 运行异常
dao.insertTeacher(teacher); // #2
}
}
运行程序,会发现#1
与#2
都未能入库。
4.2、发生受查异常时事务提交
当程序发生受查异常时,SpringBoot事务默认提交:
@Service
public class TeacherServiceImpl implements TeacherService {
@Autowired
private TeacherDao dao;
@Transactional
@Override
public void addTeacher(Teacher teacher) throws Exception {
dao.insertTeacher(teacher); // #1
if (true) {
throw new Exception(); // 受查异常
}
dao.insertTeacher(teacher); // #2
}
}
运行程序,会发现#1
成功入库,#2
由于未执行而未能入库。
5、修改受查异常时事务提交方式
当我们希望受查异常时,事务也进行回滚,我们可以通过添加@Transaction
注解中rollbackFor
参数的方式实现:
@Service
public class TeacherServiceImpl implements TeacherService {
@Autowired
private TeacherDao dao;
@Transactional(rollbackFor = Exception.class)
@Override
public void addTeacher(Teacher teacher) throws Exception {
dao.insertTeacher(teacher); // #1
if (true) {
throw new Exception(); // 受查异常
}
dao.insertTeacher(teacher); // #2
}
}
运行程序,会发现#1
与#2
都未能入库。