DB为何大量出现select @@session.tx_read_only 详解

作者:Hosee 时间:2024-01-15 15:26:15 

发现问题

在一次捞取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语句直接设置自动提交参数,隔离级别参数或只读事务参数。

来源:https://my.oschina.net/hosee/blog/1797234

标签:session.tx,read,only,db,select
0
投稿

猜你喜欢

  • Python的ORM框架SQLAlchemy入门教程

    2023-01-17 03:41:05
  • 统一的品牌设计

    2008-08-07 12:53:00
  • python数据结构之链表的实例讲解

    2021-09-24 17:58:46
  • 让网站容易被发现

    2009-04-20 20:35:00
  • MySQL InnoDB 二级索引的排序示例详解

    2024-01-15 17:11:53
  • python中arrow库用法大全

    2021-08-25 06:48:44
  • pycharm2022没有manage repositories配置镜像源的解决方法

    2022-06-27 05:30:24
  • python实现希尔密码加密的示例代码

    2022-06-16 07:55:31
  • Vue3中简单实现动态添加路由

    2023-07-02 16:58:45
  • PHP抓取及分析网页的方法详解

    2023-11-24 08:17:10
  • python PaddleSpeech实现婴儿啼哭识别

    2023-08-22 22:25:31
  • python使用socket创建tcp服务器和客户端

    2021-04-21 21:10:17
  • JavaScript实现字符串与日期的互相转换及日期的格式化

    2024-06-05 09:13:33
  • 使用Python生成随机密码的示例分享

    2023-05-23 11:32:10
  • Mysql中日期和时间函数介绍

    2008-05-24 08:16:00
  • mysql如何查询两个日期之间最大的连续登录天数

    2024-01-14 09:26:22
  • Python使用Asyncio进行web编程方法详解

    2022-08-11 17:03:56
  • pytest解读fixtures之Teardown处理yield和addfinalizer方案

    2023-06-18 22:13:01
  • Python新手如何进行闭包时绑定变量操作

    2021-05-01 15:23:55
  • 你是真正的用户体验设计者吗? Ⅵ

    2008-04-19 18:23:00
  • asp之家 网络编程 m.aspxhome.com