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

发布时间 2023-04-07 23:51:48作者: TeyGao

问题描述

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参数时存在问题,会导致“事务”中的语句被立即提交。