亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

DB為什么會大量出現select @@session.tx_read_only

發布時間:2021-07-30 11:12:31 來源:億速云 閱讀:207 作者:小新 欄目:MySQL數據庫

小編給大家分享一下DB為什么會大量出現select @@session.tx_read_only,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

發現問題

在一次撈取Top SQL中,發現DB大量執行 select @@session.tx_read_only ,幾乎每一條DML語句前,都會有這么一個sql。但是應用層并沒有做特殊處理,那么這個SQL語句有什么作用?是誰執行了它?

詳細介紹

此sql的作用主要是判斷事務是否為只讀事務。MySQL自身會對只讀事務做優化,這是 MySQL5.6.5 版本 以后才出現的。 http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_tx_read_only

定位到MySQL的驅動包

ConnectionImpl.java :

DB為什么會大量出現select @@session.tx_read_only

可以看到,在if條件中,對MySQL的 版本 做了判斷,同時也有  !getUseLocalSessionState()  這么一個條件,對應 JDBC參數useLocalSessionState ,當這個值為false時,會發出select @@session.tx_read_only; 這條sql。

默認情況下,我們的連接串信息沒有包含useLocalSessionState參數的設置,這個值默認為false。

這個值的作用是驅動程序是否使用autocommit,read_only和transaction isolation的內部值(jdbc端的本地值)。

如果設置為false,則需要這個判斷這三個參數的場景,都需要發語句到遠端請求,比如更新語句前,

需要發語句select @@session.tx_read_only確認會話是否只讀。

如果設置為true,則只需要取本地值即可。這可以解釋為什么有的實例 select @@session.tx_read_only語句很多。

一般情況下,驅動可以保證本地值與遠程服務器值保持一致。當應用調用setAutoCommit, setTransactionIsolation 和 setReadOnly這三個接口設置參數值時,會與遠程服務器同步。

具體而言,

當useLocalSessionState為true時,若值與本地值不一致,則發往遠程更新;

當useLocalSessionState為false時,無論設置值與本地值是否一致,每次都發往遠程更新。這可以解釋為什么有些實例set autocommit語句比較多。

但是,若用戶設置參數時不通過JDBC接口(比如setAutoCommit),而是執行語句'set autocommit=xxx'設置, 那么就會存在本地值與遠程不一致的情況,進而可能導致修改參數useLocalSessionState后,業務邏輯發生變化。

相關設置的SQL語句:

set autocommit=0 /*設置會話自動提交模式*/         對應的JDBC接口:  setAutoCommit(false)
set tx_isolation='read-committed' /*設置事務的隔離級別*/    對應的JDBC接口:setTransactionIsolation('read-committed') 
set tx_read_only=0; /*設置只讀事務*/             對應的JDBC接口:setReadOnly(false)

設置useLocalSessionState默認值為ture,可能導致業務邏輯含義發生變化。觸發的條件是,用戶通過SQL語句直接設置自動提交參數,隔離級別參數或只讀事務參數。

看完了這篇文章,相信你對“DB為什么會大量出現select @@session.tx_read_only”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

db
AI

东山县| 神池县| 武山县| 无棣县| 且末县| 鄂伦春自治旗| 江华| 浪卡子县| 眉山市| 彭阳县| 阳新县| 虹口区| 滨州市| 礼泉县| 肃宁县| 丽水市| 冕宁县| 扎囊县| 旬邑县| 华池县| 青铜峡市| 中宁县| 隆林| 德昌县| 施甸县| 清远市| 博爱县| 铜陵市| 布尔津县| 册亨县| 福州市| 桦川县| 宽城| 兴业县| 弋阳县| 紫云| 嘉禾县| 滦平县| 赫章县| 沁源县| 平潭县|