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