0

我是初學者,我的理解@Transactional只需確保所有@Transactional註釋的類或方法的內部工作將被包裝在一個事務中,所有來自外部來源的通話將創建一個新的交易,但爲什麼我們實際上在下面的Repository中需要這些註釋,以及在普通情況下與readOnly = true一起使用它的優點是什麼?這是使用彈簧 & 休眠https://github.com/spring-projects/spring-petclinic)彈簧寵物診所示例應用程序。使用@Transactional(readOnly = true)有什麼好處?

/** 
* 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

這是回答您的問題嗎? https://stackoverflow.com/questions/1614139/spring-transactional-read-only-propagation –

+0

你好,如果答案幫助你不要忘記接受/ upvote它。 – Cepr0

回答

0

從奧利弗·基爾克的explanation - 春節數據作者:

閱讀方法,如的findAll()和findOne(...)使用 @Transactional(唯讀= TRUE),這是不嚴格必要的,但 在交易基礎設施 觸發一些優化(在FlushMode設置爲手動模式,讓持久性提供 關閉的EntityManager時可能跳過髒檢查)。超出 該標誌在JDBC連接上也被設置,這導致 在該級別上的進一步優化。

取決於你用什麼數據庫,它可以省略表鎖,甚至 拒絕你可能會不小心觸發寫操作。因此,我們 建議使用@Transactional(唯讀=真)的查詢方法爲 以及它可以輕鬆實現並稱註釋您 倉庫接口。確保你在 接口中添加一個普通的@Transactional來處理你可能已經聲明或重新裝飾的方法。

相關問題