念:從這一點設置的時間點開始(時間點a)到這個事務結束的過程中,其他事務所提交的數據,該事務將看不見!(查詢中不會出現別人在時間點a之后提交的數據)
應用場合:
如果你一次執行單條查詢語句,則沒有必要啟用事務支持,數據庫默認支持SQL執行期間的讀一致性;
如果你一次執行多條查詢語句,例如統計查詢,報表查詢,在這種場景下,多條查詢SQL必須保證整體的讀一致性,否則,在前條SQL查詢之后,后條SQL查詢之前,數據被其他用戶改變,則該次整體的統計查詢將會出現讀數據不一致的狀態,此時,應該啟用事務支持。
【注意是一次執行多次查詢來統計某些信息,這時為了保證數據整體的一致性,要用只讀事務】
怎樣設置:
對於只讀查詢,可以指定事務類型為readonly,即只讀事務。
由於只讀事務不存在數據的修改,因此數據庫將會為只讀事務提供一些優化手段,例如Oracle對於只讀事務,不啟動回滾段,不記錄回滾log。
(1)在JDBC中,指定只讀事務的辦法為: connection.setReadOnly(true);
(2)在Hibernate中,指定只讀事務的辦法為: session.setFlushMode(FlushMode.NEVER);
此時,Hibernate也會為只讀事務提供Session方面的一些優化手段
(3)在Spring的Hibernate封裝中,指定只讀事務的辦法為: bean配置文件中,prop屬性增加“readOnly”
或者用注解方式@Transactional(readOnly=true)
【 if the transaction is marked as read-only, Spring will set the Hibernate Session’s flush mode to FLUSH_NEVER,
and will set the JDBC transaction to read-only】也就是說在Spring中設置只讀事務是利用上面兩種方式
在將事務設置成只讀后,相當於將數據庫設置成只讀數據庫,此時若要進行寫的操作,會出現錯誤