[Done]java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed


 

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*, 這樣本問題得到了解決。

 

以上。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM