MySQL Others--select @@tx_read_only 执行频率较高问题

Posted 笑东风

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL Others--select @@tx_read_only 执行频率较高问题相关的知识,希望对你有一定的参考价值。

问题描述

MySQL JDBC Driver 在 5.1.36 以下的版本且数据库版本大于 5.6.5,在每次 update/insert/delete 请求时,均会向后端数据库发送 select @@tx_read_only 命令,判断下当前会话的事务是否是只读。

MySQL JDBC Driver 在 5.1.36 以上,如果使用 execute() 而不是 executeUpdate() 方法的话,依然会发送 select @@tx_read_only 方法,参考 PreparedStatement#checkReadOnlySafeStatement。

解决方案

  • 将MySQL JDBC Driver升级到5.1.36以上版本,新版本已优化此问题。
  • 设置useLocalSessionState=true参数,这样Driver能从本地获取到当前会话的事务是否是只读,无需向MySQL服务器发起请求。

扩展阅读

  • 参数tx_read_only和参数transaction_read_only等同,参数transaction_read_only在5.7.20被引入,参数tx_read_only在MySQL 8.0版本中被移除。

  • mysql-connector-java:8.0.28 存在bug,在判断事务autocommit参数时存在问题,会导致“事务”中的语句被立即提交。

mysql 修改事务隔离级别

语法:

SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}

查看:

select @@global.tx_isolation;

select @@session.tx_isolation;

select @@tx_isolation;

以上是关于MySQL Others--select @@tx_read_only 执行频率较高问题的主要内容,如果未能解决你的问题,请参考以下文章

Go基础之--操作Mysql

解决问题:java.sql.SQLException: Unknown system variable 'tx_isolation'

修改mysql事务隔离

查询修改mysql事务隔离级别

10.Spring事务管理TX

手把手教你分析Mysql死锁问题