Spring控制器方法中的所有操作是否都属于同一事务?
问题解答:Spring控制器方法中的所有操作是否都属于同一事务?
不,默认情况下你这个控制器方法里的所有操作并不属于同一事务,具体原因和细节我给你拆解一下:
控制器本身默认无事务:Spring MVC的控制器方法默认是没有事务管理加持的,也就是说控制器不会主动开启或管理事务。事务的控制逻辑通常应该放在业务层(Service层),这也是Spring推荐的分层设计原则。
Service方法的事务是独立的:你代码里调用的
employeeService.createEmployee(employeeDto)和employeeService.getEmployee(employeeId),它们的事务完全取决于各自Service方法上的@Transactional注解配置:- 如果这两个方法都标注了
@Transactional,那它们会各自开启独立的事务——createEmployee的事务提交后,getEmployee才能读取到刚创建的员工数据(默认的事务传播行为是REQUIRED,如果当前没有事务就新建一个)。 - 如果Service方法没加
@Transactional,那这两个操作都会在无事务的环境下执行。
- 如果这两个方法都标注了
Callable异步逻辑不影响事务:你返回
Callable<EmployeeDTO>是为了实现请求的异步处理,但注意:createEmployee和getEmployee都是在控制器方法的主线程中同步执行的,异步部分只是() -> createdEmployee,这一步只是返回已经获取到的对象,不会涉及新的数据库操作,所以对事务没有影响。
如果想要让这两个操作处于同一事务中,正确的做法是在Service层封装一个包含这两个操作的方法,比如:
@Transactional public EmployeeDTO createAndGetEmployee(EmployeeDTO employeeDto) { long employeeId = createEmployee(employeeDto); return getEmployee(employeeId); }
然后在控制器中调用这个封装后的Service方法,这样整个流程就会处于同一个事务中了。
内容的提问来源于stack exchange,提问作者N B
相关产品推荐
相关产品推荐

