使用@Transactional(readOnly = true)有什么好处?

时间:2017-07-08 09:46:56

标签: spring hibernate transactions spring-data spring-transactions

我是初学者,据我所知@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);

}

1 个答案:

答案 0 :(得分:2)

来自Oliver Gierke的explanation - Spring Data作者:

  

使用findAll()和findOne(...)等读取方法   @Transactional(readOnly = true)这不是绝对必要但是   触发事务基础结构中的一些优化   (将FlushMode设置为MANUAL以允许持久性提供程序   关闭EntityManager时可能会跳过脏检查。外   标志也在JDBC连接上设置,这会导致   进一步优化该级别。

     

根据您使用的数据库,它可以省略表锁甚至   拒绝你可能意外触发的写操作。因此我们   建议使用@Transactional(readOnly = true)作为查询方法   以及您可以轻松实现向您添加注释的好处   存储库接口。确保你添加一个普通的@Transactional   操纵你可能已声明或重新装饰的方法   接口