@Transactional(readOnly=true)就可以把事務方法設置成只讀事務。設置了只讀事務,事務從開始到結束,將看不見其他事務所提交的數據。這在某種程度上解決了事務併發的問題。一個方法內,如果沒有對資料庫insert、update、delete的操作,那麼,這個事務方法是可以設置成re ...
@Transactional(readOnly=true)
就可以把事務方法設置成只讀事務。設置了只讀事務,事務從開始到結束,將看不見其他事務所提交的數據。這在某種程度上解決了事務併發的問題。一個方法內,如果沒有對資料庫insert、update、delete的操作,那麼,這個事務方法是可以設置成readOnly=true。
事務方法設置成只讀事務,會發生什麼?
1、只讀事務方法內,資料庫的操作只能是讀取數據。
如果只讀事務方法內有對資料庫進行insert、update、delete的操作,則會報異常。
Connection is read-only. Queries leading to data modification are not allowed
2、只讀事務方法內,多次調用同一個方法,查詢結果都一樣,不會受到併發事務的影響。
如果只讀事務方法內,多次調用同一個方法,查詢結果將會使用第一次查詢的緩存。但是,如果調用的不是同一個方法(即使這兩個方法里的select語句是一模一樣),多次調用方法得到的查詢結果就會受到併發事務的影響。也就是說,如果多次調用不同的方法(即使這兩個方法里的select語句是一模一樣),多次調用期間,如果有其他事務修改了數據並提交了,就會得出不一樣的查詢結果。
3、只讀事務方法內,ORM框架會對其進行查詢優化。
由於只讀事務不存在數據的修改,因此資料庫將會為只讀事務提供一些優化手段,例如Oracle對於只讀事務,不啟動回滾段,不記錄回滾log。