查閱資料和自己進行測試,得出結論簡介:
測試數據庫爲 MySQL,事物隔離級別:讀已提交(MySQL的默認隔離級別)
- 只讀事務內,不能進行增、刪、改操作,否則出現異常:cannot execute statement in a read-only transaction;
- 只讀事務內,同一個查詢方法的多次調用查詢結果一致,不會讀取到其他事務修改的數據;
- 加只讀事務,ORM框架會對其進行查詢優化;
下面對結論得出過程和結果進行展示:
測試邏輯:
在一個方法上面添加只讀事物註解,方法內部執行兩個相同的查詢方法和一個和相同SQL語句不同方法名稱的方法(一共三次查詢)代碼見下圖↓,第一次查詢和第二次查詢之間休眠10秒,這段時間內另一個事物執行更新操作(更新查詢的該條數據),然後對比查詢結果。
一,針對第一條結論得出過程:
1.執行代碼:
(圖-1)
2.執行結果:
(圖-2)
二,針對第二條結論得出過程(有無只讀事物註解的情況):
1.執行代碼:
(圖-3)
2.執行結果(加了只讀事物註解的情況):
(圖-4)
3.執行結果(沒有添加只讀事物註解的情況):
(圖-5)
1. 只讀事務內,同一個查詢方法的多次調用查詢結果一致,不會讀取到其他事務修改的數據:
這個是由數據庫的事物隔離級別決定的,MySQL的默認隔離級別是"可重複讀",從SQL日誌可以看出第二次查詢的時候使用的是第一次查詢的緩存結果,並沒有查數據庫,雖然在第二次查詢之前數據庫裏面的數據已經被改變了,但是他得到的結果還是和第一次查詢的一致;注意:這裏是相同方法,如果不是相同方法,就如圖(圖-3)查詢代碼所示,不同方法,就算是相同SQL語句得到的結果也不一樣。
2.加只讀事務,ORM框架會對其進行查詢優化(沒有自己驗證究竟是怎麼優化的下面是其他文章摘取):
由於只讀事務不存在數據的修改,因此數據庫將會爲只讀事務提供一些優化手段,例如Oracle對於只讀事務,不啓動回滾段,不記錄回滾log。