我是初学者,据我所知@Transactional
,只需确保用@Transactional
注释的类或方法的所有内部工作都将包含在一个事务中,所有来自外部源的调用都将创建一个新的事务,但为什么我们实际上需要在下面的存储库中使用这些注释,在常见情况下使用readOnly = true
有什么好处?这是使用 Spring &amp ;;的Spring宠物诊所示例应用程序。 休眠(https://github.com/spring-projects/spring-petclinic)。
/**
* Repository class for <code>Pet</code> domain objects All method names are compliant with Spring Data naming
* conventions so this interface can easily be extended for Spring Data See here: http://static.springsource.org/spring-data/jpa/docs/current/reference/html/jpa.repositories.html#jpa.query-methods.query-creation
*
* @author Ken Krebs
* @author Juergen Hoeller
* @author Sam Brannen
* @author Michael Isvy
*/
public interface PetRepository extends Repository<Pet, Integer> {
/**
* Retrieve all {@link PetType}s from the data store.
* @return a Collection of {@link PetType}s.
*/
@Query("SELECT ptype FROM PetType ptype ORDER BY ptype.name")
@Transactional(readOnly = true)
List<PetType> findPetTypes();
/**
* Retrieve a {@link Pet} from the data store by id.
* @param id the id to search for
* @return the {@link Pet} if found
*/
@Transactional(readOnly = true)
Pet findById(Integer id);
/**
* Save a {@link Pet} to the data store, either inserting or updating it.
* @param pet the {@link Pet} to save
*/
void save(Pet pet);
}
答案 0 :(得分:2)
来自Oliver Gierke的explanation - Spring Data作者:
使用findAll()和findOne(...)等读取方法 @Transactional(readOnly = true)这不是绝对必要但是 触发事务基础结构中的一些优化 (将FlushMode设置为MANUAL以允许持久性提供程序 关闭EntityManager时可能会跳过脏检查。外 标志也在JDBC连接上设置,这会导致 进一步优化该级别。
根据您使用的数据库,它可以省略表锁甚至 拒绝你可能意外触发的写操作。因此我们 建议使用@Transactional(readOnly = true)作为查询方法 以及您可以轻松实现向您添加注释的好处 存储库接口。确保你添加一个普通的@Transactional 操纵你可能已声明或重新装饰的方法 接口