Spring 事物註解@Transactional(readOnly=true)

查閱資料和自己進行測試,得出結論簡介:

測試數據庫爲 MySQL,事物隔離級別:讀已提交(MySQL的默認隔離級別)

  1. 只讀事務內,不能進行增、刪、改操作,否則出現異常:cannot execute statement in a read-only transaction;
  2. 只讀事務內,同一個查詢方法的多次調用查詢結果一致,不會讀取到其他事務修改的數據;
  3. 加只讀事務,ORM框架會對其進行查詢優化;

下面對結論得出過程和結果進行展示:

測試邏輯:

        在一個方法上面添加只讀事物註解,方法內部執行兩個相同的查詢方法和一個和相同SQL語句不同方法名稱的方法(一共三次查詢)代碼見下圖↓,第一次查詢和第二次查詢之間休眠10秒,這段時間內另一個事物執行更新操作(更新查詢的該條數據),然後對比查詢結果。

 

一,針對第一條結論得出過程:

1.執行代碼:

                                                                                    (圖-1)

2.執行結果:

                                                                                        (圖-2)

二,針對第二條結論得出過程(有無只讀事物註解的情況):

1.執行代碼:

                                                                                        (圖-3)

2.執行結果(加了只讀事物註解的情況):

                                                                                        (圖-4)

3.執行結果(沒有添加只讀事物註解的情況):

                                                                                        (圖-5)

1. 只讀事務內,同一個查詢方法的多次調用查詢結果一致,不會讀取到其他事務修改的數據:

       這個是由數據庫的事物隔離級別決定的,MySQL的默認隔離級別是"可重複讀",從SQL日誌可以看出第二次查詢的時候使用的是第一次查詢的緩存結果,並沒有查數據庫,雖然在第二次查詢之前數據庫裏面的數據已經被改變了,但是他得到的結果還是和第一次查詢的一致;注意:這裏是相同方法,如果不是相同方法,就如圖(圖-3)查詢代碼所示,不同方法,就算是相同SQL語句得到的結果也不一樣。

2.加只讀事務,ORM框架會對其進行查詢優化(沒有自己驗證究竟是怎麼優化的下面是其他文章摘取):

         由於只讀事務不存在數據的修改,因此數據庫將會爲只讀事務提供一些優化手段,例如Oracle對於只讀事務,不啓動回滾段,不記錄回滾log。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章