Spring Boot 使用事务非常简单,底层依然采用的是Spring本身提供的事务管理
- 在入口类中使用注解 @EnableTransactionManagement 开启事务支持
- 在访问数据库的Service方法上添加注解 @Transactional 即可
案例思路:
通过SpringBoot +MyBatis实现对数据库学生表的更新操作,在service层的方法中构建异常,查看事务是否生效
实现步骤:
① 在StudentController中添加更新学生的方法
@Controller
public class SpringBootController {
@Autowired
private StudentService studentService;
@RequestMapping(value = "/springBoot/update")
public @ResponseBody Object update() {
Student student = new Student();
student.setId(1);
student.setName("Mark");
student.setAge(100);
int updateCount = studentService.update(student);
return updateCount;
}
}
②在StudentService接口中添加更新学生方法
ublic interface StudentService {
/**
* 根据学生标识更新学生信息
* @param student
* @return
*/
int update(Student student);
}
③在StudentServiceImpl接口实现类中对更新学生方法进行实现,并构建一个异常,同时在该方法上加@Transactional注解
Override
@Transactional //添加此注解说明该方法添加的事务管理
public int update(Student student) {
int updateCount = studentMapper.updateByPrimaryKeySelective(student);
System.out.println("更新结果:" + updateCount);
//在此构造一个除数为0的异常,测试事务是否起作用
int a = 10/0;
return updateCount;
}
④在Application类上加@EnableTransactionManagement开启事务支持
@EnableTransactionManagement可选,但是@Service必须添加事务才生效
@SpringBootApplication
@EnableTransactionManagement //SpringBoot开启事务的支持
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
⑤启动Application,通过浏览器访问进行测试
测试结果:浏览器会报 500;控制台会报 erro 错误;数据库信息未更改,说明事物起作用了。
注释掉StudentServiceImpl上的@Transactional测试,数据库数据被更新,说明事物未起效(即未启动)。
异常:提供 程序出现例外情况,通过妥善处理,让程序能够执行下去的 一种机制
运行时异常:非受检查异常 由于程序人员考虑不周密,出现的例外情况
编译时异常:受检查异常 提醒检查程序事物起作用就是在监控编译时异常,要想运行时异常事物也起作用,需要在注解中设置属性。在业务逻辑层添加属性 rollerbackFor(事物回滚)
@Override
@Transactional(rollbackFor = FileNotFoundException.class,propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT)
public int update(Student student) throws FileNotFoundException {
int num = studentMapper.updateByPrimaryKeySelective(student);
// int j=100/0;
new FileInputStream("");
return num;
}