在一次捞取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 :
劳务调派系统ct @@session.tx_read_only" src="http://www.importnew.com/https:/static.oschina.net/uploads/space/2018/0418/132522_ANnF_2243330.png" width="1265" height="595" />
可以看到,在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语句直接配置自动提交参数,断绝级别参数或只读事务参数。