mycat设置sql隔离级别的问题

问题

General log中出现大量SQL “SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ”。

该语句会引起两个问题,

1: "REPEATABLE READ"不是我们预期的事物隔离级别。

2: 大量无效的SQL影响性能。

注: MySql的可重复读会带来怎样的问题,可以参考该文章。https://www.jianshu.com/p/f7360d259878

mycat设置sql隔离级别的问题_第1张图片

排查

排查过程涉及到以下几个方面:

  1. Druid Datasource框架创建连接池

  2. Jdbc连接初始化过程

  3. MySql 版本间SQL语句差异

  4. MyCat工作原理

  5. Spring框架如何管理事物

Druid Datasource框架创建连接池

mycat设置sql隔离级别的问题_第2张图片

Jdbc连接初始化过程

mycat设置sql隔离级别的问题_第3张图片

MySql 版本间SQL语句差异

由上图可以见,对于具体发送哪一条SQL语句去向MySql服务端请求事物隔离级别由版本决定的。MySql的版本5.7.20是一个分界线。

对于小于5.7.20的MySql版本使用的是“select @@session.tx_isolation”。

对于大于5.7.20的MySql版本使用的是“select @@session.transaction_isolation”

MyCat工作原理

mycat 在server.xml中设置隔离级别为RC,mysql级别设置隔离级别为RC。

但是,连接mycat,通过 “select @@session.tx_isolation” 查出来的隔离级别是RR。

通过 “select @@session.transaction_isolation” 查出来的隔离级别是RC。

如下两图所示,

连接MyCat的情况:

mycat设置sql隔离级别的问题_第4张图片

直接连接MySql的情况:

mycat设置sql隔离级别的问题_第5张图片

Spring框架如何管理事物

注: Spring事物原理分析,可以参考该文章。 https://www.jianshu.com/p/ecf55d6f0118

修复

  1. 使用本地事物级别代替向服务端发送请求询问隔离级别(“&useLocalSessionState=true”,驱动程序是否应引用autocommit的内部值,以及由Connection.setAutoCommit()和Connection.setTransactionIsolation()设置的事务隔离)
  2. MyCat使用参数 “5.7.20” 向客户端返回正确的版本信息。用来消除版本之间SQL的细微差别。

你可能感兴趣的:(mycat,sql,mycat)