事務配置如下:
serviceimpl類的方法
報錯
javax.persistence.TransactionRequiredException: no transaction is in progress at org.hibernate.internal.AbstractSharedSessionContract.checkTransactionNeededForUpdateOperation(AbstractSharedSessionContract.java:409) at org.hibernate.internal.SessionImpl.checkTransactionNeededForUpdateOperation(SessionImpl.java:3602) at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1483) at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1479)
說明:serviceimpl的方法名是find*();已經在事務中配置為<tx:method name="find*" propagation="SUPPORTS"/>
SUPPORTS:支持當前事務,如果當前沒有事務,就以非事務方式執行。
不明白為什么還是會報javax.persistence.TransactionRequiredException: no transaction is in progress
后來將<tx:method name="find*" propagation="SUPPORTS"/> 改為<tx:method name="find*" propagation="SUPPORTS" read-only="true"/>問題解決
read-only應用場合:
如果你一次執行單條查詢語句,則沒有必要啟用事務支持,數據庫默認支持SQL執行期間的讀一致性;
如果你一次執行多條查詢語句,例如統計查詢,報表查詢,在這種場景下,多條查詢SQL必須保證整體的讀一致性,否則,在前條SQL查詢之后,后條SQL查詢之前,數據被 其他用戶改變,則該次整體的統計查詢將會出現讀數據不一致的狀態,此時,應該啟用事務支持。
【注意是一次執行多次查詢來統計某些信息,這時為了保證數據整體的一致性,要用只讀事務】