我们有一个Spring Boot应用程序,它严重依赖于SimpleJpaRepository实现来执行数据库CRUD操作。
问题:该类带有
我们希望我们的存储库仅为插入/更新/删除操作生成SQL事务,而不是选择操作(除非它们是从另一个使用
我们如何设置我们的存储库以实现此目的,并且会有哪些不太明显的影响? (我假设该类之所以带有这样的注释是有原因的)
代码和日志
调用 @Transactional 方法,期望 1 个事务,发现 1 个 (OK)
SQL Profiler:
没有使用 @Transactional,预期不会有事务,但发现了 2 个事务,这些事务是由仓库创建的(错误):
问题:该类带有
@Transactional
注释,导致调用的所有方法都被包装在SQL事务中。我们希望我们的存储库仅为插入/更新/删除操作生成SQL事务,而不是选择操作(除非它们是从另一个使用
@Transactional
注释的方法调用的)。我们如何设置我们的存储库以实现此目的,并且会有哪些不太明显的影响? (我假设该类之所以带有这样的注释是有原因的)
代码和日志
调用 @Transactional 方法,期望 1 个事务,发现 1 个 (OK)
@Transactional
public User readUser(int id){
userRepository.findOne(id);
roleRepository.findByUser(id);
}
SQL Profiler:
set implicit_transactions on
exec sp_executesql N'select userentity0_.id as id1_45_, .....'
exec sp_executesql N'select roleassign0_.id as id1_36_, ....'
IF @@TRANCOUNT > 0 COMMIT TRAN
没有使用 @Transactional,预期不会有事务,但发现了 2 个事务,这些事务是由仓库创建的(错误):
public User readUser(int id){
userRepository.findOne(id);
roleRepository.findByUser(id);
}
SQL Profiler:
set implicit_transactions on
exec sp_executesql N'select userentity0_.id as id1_45_, .....'
IF @@TRANCOUNT > 0 COMMIT TRAN
set implicit_transactions on
exec sp_executesql N'select roleassign0_.id as id1_36_, ....'
IF @@TRANCOUNT > 0 COMMIT TRAN
SimpleJpaRepository
。 - Alexandru SeverinSimpleJpaRepository
中实现的方法都有Transactional
注解。 - Kavithakaran Kanapathippillai