I have @Transactional
控制器类中的方法如下:
主要问题是每个服务调用根据日志在其自己的事务中运行。
控制器是否忽略了事务功能?
我希望学生记录不会被保存,因为我在使用另一个服务之后抛出异常,但更新仍然发生在数据库中。我什至有@EnableTransactionManagement
在配置类上。你能帮我解决这个问题吗?
@RestController
@RequestMapping("/api")
public class Resource {
@Transactional
@RequestMapping(value="/test", method = RequestMethod.PUT, produces = "application/json")
public StudentDTO updateRecord(@RequestBody StudentDTO DTO) throws ApplicationException{
studentservice.find(1234); //jparepository.findone() runs in one transaction
studentservice.save(dto); //jparepository.save() runs in one transaction
testservice.throwException(); // this method throws application exception
}
@Configuration
@ComponentScan(basePackages={"com.student.*"})
@EnableAutoConfiguration(exclude = {MetricFilterAutoConfiguration.class, MetricRepositoryAutoConfiguration.class})
@EnableConfigurationProperties
@EnableTransactionManagement
public class Application {
}
下面是日志:
[TRACE] org.springframework.transaction.interceptor.TransactionInterceptor - Getting transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.findOne]
[TRACE] org.springframework.transaction.interceptor.TransactionInterceptor - Completing transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.findOne]
[TRACE] org.springframework.transaction.interceptor.TransactionInterceptor - Getting transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save]
[TRACE] org.springframework.transaction.interceptor.TransactionInterceptor - Completing transaction for [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save]
[TRACE] org.springframework.transaction.interceptor.TransactionInterceptor - Completing transaction for [updaterecord] after exception: xx.xx.ApplicationException
[TRACE] org.springframework.transaction.interceptor.RuleBasedTransactionAttribute - Applying rules to determine whether transaction should rollback on xx.xx.ApplicationException
[TRACE] org.springframework.transaction.interceptor.RuleBasedTransactionAttribute - Winning rollback rule is: null
[TRACE] org.springframework.transaction.interceptor.RuleBasedTransactionAttribute - No relevant rollback rule found: applying default rules
我正在使用 spring data jpa,studentservice.find(1234)
调用//jparepository.findone()
在 1 个事务中运行的方法studentservice.save(dto);
调用//jparepository.save()
运行在另一个事务中,我们可以从上面的日志中看出
很可能更建议您的事务边界应该在服务层而不是在控制器中声明。
更详细的解释请看这里:为什么我们不应该让 Spring MVC 控制器@Transactional? https://stackoverflow.com/questions/23118789/spring-mvc-controller-shouldnt-be-transactional-why
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)