java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed
追查原因,查看切片事務配置如下:
查看源碼:
初始化階段-Step1:解析到xml配置,在RuleBasedTransactionAttribute中設置query*開發的方法的readOnly值為true
save等方法設置為fase:
運行階段-Step1:(切片事務運行的邏輯大概簡單說下:就是切點方法執行前會打開一個connection放在TransactionSynchronizationManager的threadLocal變量中,切點方法中第一個dao執行前則會創建應該session同樣放在TransactionSynchronizationManager的threadLocal變量中,【TransactionSynchronizationManager】是一個比較核心的類,值得投入時間好好翻一下的,這個不展開講了)
獲取上面設置的readonly值
運行階段-Step2:在切點方法執行前建立connection,此時根據配置設置連接只讀:
並把只讀狀態設置進TransactionSynchronizationManager的threadLocal變量中,如下:
進而到>>
進而到>>
運行階段-Step3:具體在運行時,connection進行數據庫操作,如果這個連接是只讀,就會報開頭的錯誤。
解決方案:
本問題所在的業務場景是:查詢一個核心的表,但是需求是需要記錄這一次查詢操作,這個方法是以query*開頭,切片事務配置是connection只讀,所以報了上面的錯誤。
最終的解決方法是,修改了方法名稱,改為:saveLogAfterQuery*, 這樣本問題得到了解決。
以上。