【问题标题】:Spring REST Controller transactionsSpring REST 控制器事务
【发布时间】:2015-05-04 16:51:14
【问题描述】:
我有一个 Spring RestController MyRestController,其中包含 RequestMapping myMethod 和自动装配的 Spring Data Repository myRepository。在 myMethod 中,我调用 myRepository:myRepository.save(myEntity) 和 myRepository.findByMyProperty(...)。什么时候开始交易? (在 myMethod 调用之前一个还是在每个 myRepository 方法调用之前几个)?
我对这个问题感到非常困惑。谁能帮我说清楚,拜托。
【问题讨论】:
标签:
spring
transactions
spring-data
【解决方案1】:
According to the spring-data documentation:
默认情况下,存储库实例上的 CRUD 方法是事务性的。
因此,只要您使用CrudRepository 的子类,您的save() 方法就是事务性的。
您的查询方法默认情况下不是事务性的,文档说:
要让您的查询方法具有事务性,只需在您定义的存储库接口处使用@Transactional。
所以你应该注释你的存储库:
@Transactional(readOnly = true)
public interface MyRepository extends JpaRepository<My, Long> {
List<User> findByMyProperty(String myProperty);
}
【解决方案2】:
默认情况下,事务在每个 myRepository 方法调用之前开始,要完全控制事务,请在调用存储库方法的每个服务方法上使用 @Transactional。