国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

DB為何大量出現(xiàn)select @@session.tx_read_only 詳解

2024-07-25 19:08:18
字體:
供稿:網(wǎng)友

發(fā)現(xiàn)問題

在一次撈取Top SQL中,發(fā)現(xiàn)DB大量執(zhí)行 select @@session.tx_read_only ,幾乎每一條DML語句前,都會(huì)有這么一個(gè)sql。但是應(yīng)用層并沒有做特殊處理,那么這個(gè)SQL語句有什么作用?是誰執(zhí)行了它?

詳細(xì)介紹

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

定位到MySQL的驅(qū)動(dòng)包

ConnectionImpl.java :

session.tx,read,only,tx,db,select

可以看到,在if條件中,對(duì)MySQL的 版本 做了判斷,同時(shí)也有  !getUseLocalSessionState()  這么一個(gè)條件,對(duì)應(yīng) JDBC參數(shù)useLocalSessionState ,當(dāng)這個(gè)值為false時(shí),會(huì)發(fā)出select @@session.tx_read_only; 這條sql。

默認(rèn)情況下,我們的連接串信息沒有包含useLocalSessionState參數(shù)的設(shè)置,這個(gè)值默認(rèn)為false。

這個(gè)值的作用是驅(qū)動(dòng)程序是否使用autocommit,read_only和transaction isolation的內(nèi)部值(jdbc端的本地值)。

如果設(shè)置為false,則需要這個(gè)判斷這三個(gè)參數(shù)的場(chǎng)景,都需要發(fā)語句到遠(yuǎn)端請(qǐng)求,比如更新語句前,

需要發(fā)語句select @@session.tx_read_only確認(rèn)會(huì)話是否只讀。

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

一般情況下,驅(qū)動(dòng)可以保證本地值與遠(yuǎn)程服務(wù)器值保持一致。當(dāng)應(yīng)用調(diào)用setAutoCommit, setTransactionIsolation 和 setReadOnly這三個(gè)接口設(shè)置參數(shù)值時(shí),會(huì)與遠(yuǎn)程服務(wù)器同步。

具體而言,

當(dāng)useLocalSessionState為true時(shí),若值與本地值不一致,則發(fā)往遠(yuǎn)程更新;

當(dāng)useLocalSessionState為false時(shí),無論設(shè)置值與本地值是否一致,每次都發(fā)往遠(yuǎn)程更新。這可以解釋為什么有些實(shí)例set autocommit語句比較多。

但是,若用戶設(shè)置參數(shù)時(shí)不通過JDBC接口(比如setAutoCommit),而是執(zhí)行語句'set autocommit=xxx'設(shè)置, 那么就會(huì)存在本地值與遠(yuǎn)程不一致的情況,進(jìn)而可能導(dǎo)致修改參數(shù)useLocalSessionState后,業(yè)務(wù)邏輯發(fā)生變化。

相關(guān)設(shè)置的SQL語句:

set autocommit=0 /*設(shè)置會(huì)話自動(dòng)提交模式*/         對(duì)應(yīng)的JDBC接口:  setAutoCommit(false)set tx_isolation='read-committed' /*設(shè)置事務(wù)的隔離級(jí)別*/    對(duì)應(yīng)的JDBC接口:setTransactionIsolation('read-committed') set tx_read_only=0; /*設(shè)置只讀事務(wù)*/             對(duì)應(yīng)的JDBC接口:setReadOnly(false)

設(shè)置useLocalSessionState默認(rèn)值為ture,可能導(dǎo)致業(yè)務(wù)邏輯含義發(fā)生變化。觸發(fā)的條件是,用戶通過SQL語句直接設(shè)置自動(dòng)提交參數(shù),隔離級(jí)別參數(shù)或只讀事務(wù)參數(shù)。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)VeVb武林網(wǎng)的支持。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到MYSQL教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 苍南县| 吴川市| 昌图县| 福泉市| 沙坪坝区| 平原县| 东丽区| 东台市| 和静县| 读书| 青阳县| 额济纳旗| 宁海县| 古交市| 沁水县| 合肥市| 南昌县| 海盐县| 五家渠市| 庆安县| 章丘市| 南陵县| 长岭县| 呼玛县| 崇左市| 南京市| 合江县| 绥芬河市| 左贡县| 聂拉木县| 延川县| 安福县| 青龙| 溧水县| 常宁市| 寻乌县| 徐水县| 大姚县| 来凤县| 成武县| 民丰县|