当前位置: 首页 > article >正文

MySQL 5.7.12 + Druid 连接池“只读事务”异常深度剖析(Cannot execute statement in a READ ONLY transaction)

一、故障现象在 MySQL 5.7.12 环境下使用 Druid 连接池的应用偶尔会抛出以下异常Cannot execute statement in a READ ONLY transaction诡异特征偶发性出现并非每次操作都复现conn.isReadOnly()返回false但 MySQL 实际报错只读手工执行SET SESSION TRANSACTION READ WRITE后可恢复无法在数据库客户端中手工稳定复现二、底层原理三层状态机撕裂问题的本质是Druid 连接池、JDBC 驱动、MySQL 服务器三者之间的会话状态不一致。2.1 JDBC 驱动的“短路”逻辑MySQL Connector/J 驱动有一个性能优化参数useLocalSessionState默认为true其核心代码如下// ConnectionImpl.setReadOnly() 简化逻辑publicvoidsetReadOnly(booleanreadOnly)throwsSQLException{if(this.useLocalSessionState){// 关键如果内存状态与新状态一致直接返回不发任何包if(readOnlythis.isReadOnly()){return;// ← 问题根源跳过 SQL 发送}}// 只有状态不一致时才真正发送 SQLthis.session.sendCommand(SET SESSION TRANSACTION (readOnly?READ ONLY:READ WRITE));}核心问题当useLocalSessionStatetrue时setReadOnly()调用不一定会真正发送 SQL 到 MySQL。2.2 故障完整时序推演┌─────────────────────────────────────────────────────────────────────────────┐ │ 阶段一连接被污染 │ ├─────────────────────────────────────────────────────────────────────────────┤ │ 应用A: conn.setReadOnly(true) │ │ ↓ JDBC 驱动发送SET SESSION TRANSACTION READ ONLY │ │ ↓ │ │ MySQL 会话状态tx_read_only 1只读 │ │ JDBC 内存状态this.readOnly true │ │ Druid 记录状态holder.isUnderlyingReadOnly() true │ └─────────────────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────────────────┐ │ 阶段二连接回收与“伪重置” │ ├─────────────────────────────────────────────────────────────────────────────┤ │ Druid 回收连接尝试重置conn.setReadOnly(false) │ │ ↓ JDBC 检查当前内存状态 true目标 false → 不一致 │ │ ↓ 正常发送SET SESSION TRANSACTION READ WRITE │ │ ↓ │ │ MySQL 会话状态tx_read_only 0读写【恢复正常】 │ │ JDBC 内存状态this.readOnly false │ └─────────────────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────────────────┐ │ 阶段三致命跳过问题发生的瞬间 │ ├─────────────────────────────────────────────────────────────────────────────┤ │ 某个时机网络波动 / Druid 后台管理线程 / 下次获取连接时的校验 │ │ Druid 再次调用 conn.setReadOnly(false) │ │ ↓ JDBC 检查当前内存状态 false目标 false → 一致 │ │ ↓ 【致命跳过】不发送任何 SQL 到 MySQL │ │ ↓ │ │ MySQL 会话状态tx_read_only 0还是 1可能存在状态残留 │ │ MySQL 5.7.12 的 tx_read_only 状态在事务结束后仍保留 │ │ 实际 MySQL 状态可能仍为只读但 JDBC 认为已经是读写 │ └─────────────────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────────────────┐ │ 阶段四连接复用导致异常 │ ├─────────────────────────────────────────────────────────────────────────────┤ │ 应用B 获取该连接执行 UPDATE 操作 │ │ ↓ │ │ MySQL 检测到会话仍为只读状态 → 返回错误 │ │ Cannot execute statement in a READ ONLY transaction │ │ ↓ │ │ 而 conn.isReadOnly() 返回 falseJDBC 内存状态为 false │ │ 应用层完全无法感知问题所在 │ └─────────────────────────────────────────────────────────────────────────────┘2.3 为什么手工无法复现手工通过 MySQL 客户端操作时不存在 JDBC 驱动的状态缓存层每次SET SESSION都会真实执行因此无法复现此问题。复现需要同时满足JDBC 驱动开启useLocalSessionStatetrue默认Druid 连接池的连接复用机制特定的时序条件Druid 重复调用setReadOnly(false)MySQL 5.7.12 的tx_read_only状态残留特性三、解决方案3.1 根本解决方案关闭 JDBC 状态缓存核心配置设置 MySQL JDBC 驱动参数useLocalSessionStatefalse⚠️注意useLocalSessionState是MySQL JDBC 驱动的参数不是 Druid 的属性。Druid 只是将其透传给底层连接。3.2 Spring Boot Druid 正确配置示例方式一JDBC URL 中指定推荐spring:datasource:# 关键在 URL 中添加 useLocalSessionStatefalseurl:jdbc:mysql://localhost:3306/test?useLocalSessionStatefalseusername:rootpassword:123456type:com.alibaba.druid.pool.DruidDataSourcedruid:initial-size:5max-active:20min-idle:5test-on-borrow:truevalidation-query:SELECT 1default-read-only:false方式二通过 connectionProperties 指定spring:datasource:url:jdbc:mysql://localhost:3306/testusername:rootpassword:123456type:com.alibaba.druid.pool.DruidDataSourcedruid:# 关键通过 connectionProperties 传递驱动参数connection-properties:useLocalSessionStatefalseinitial-size:5max-active:20test-on-borrow:truevalidation-query:SELECT 1default-read-only:false方式三Java Config 配置ConfigurationpublicclassDataSourceConfig{BeanpublicDataSourcedataSource(){DruidDataSourcedataSourcenewDruidDataSource();dataSource.setUrl(jdbc:mysql://localhost:3306/test);dataSource.setUsername(root);dataSource.setPassword(123456);// 核心设置 useLocalSessionStatefalseJDBC 驱动参数dataSource.setConnectionProperties(useLocalSessionStatefalse);// 可选增强配置dataSource.setConnectionInitSqls(Arrays.asList(SET SESSION TRANSACTION READ WRITE));dataSource.setDefaultReadOnly(false);dataSource.setTestOnBorrow(true);dataSource.setValidationQuery(SELECT 1);returndataSource;}}方式四application.properties# 方式AURL 中添加 spring.datasource.urljdbc:mysql://localhost:3306/test?useLocalSessionStatefalse # 方式BconnectionProperties 中添加 spring.datasource.druid.connection-propertiesuseLocalSessionStatefalse # 通用配置 spring.datasource.usernameroot spring.datasource.password123456 spring.datasource.typecom.alibaba.druid.pool.DruidDataSource spring.datasource.druid.default-read-onlyfalse spring.datasource.druid.test-on-borrowtrue spring.datasource.druid.validation-querySELECT 13.3 完整配置示例生产推荐spring:datasource:url:jdbc:mysql://localhost:3306/test?useLocalSessionStatefalseuseSSLfalsecharacterEncodingutf8username:rootpassword:123456type:com.alibaba.druid.pool.DruidDataSourcedruid:# 连接池基础配置initial-size:10max-active:50min-idle:10max-wait:60000# 核心禁用 JDBC 状态缓存connection-properties:useLocalSessionStatefalse# 连接校验增强可靠性test-on-borrow:truetest-while-idle:truevalidation-query:SELECT 1# 强制初始化状态default-read-only:falseconnection-init-sqls:-SET SESSION TRANSACTION READ WRITE# 回收策略time-between-eviction-runs-millis:60000min-evictable-idle-time-millis:3000003.4 配置对比表配置方式示例说明❌ 错误druidDataSource.setUseLocalSessionState(false)Druid 没有此属性✅ 正确jdbc:mysql://host/db?useLocalSessionStatefalseURL 参数传递✅ 正确connection-properties: useLocalSessionStatefalse连接属性传递四、原理总结┌─────────────────────────────────────────────────────────────────┐ │ 问题根因 │ ├─────────────────────────────────────────────────────────────────┤ │ useLocalSessionStatetrue默认 │ │ ↓ │ │ JDBC 驱动缓存会话状态重复调用 setReadOnly(false) 被“短路” │ │ ↓ │ │ 不发 SQL 到 MySQLMySQL 实际状态与 JDBC 内存状态撕裂 │ │ ↓ │ │ 连接复用时执行写入操作 → READ ONLY transaction 异常 │ └─────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────┐ │ 解决方案 │ ├─────────────────────────────────────────────────────────────────┤ │ useLocalSessionStatefalse │ │ ↓ │ │ 强制 JDBC 驱动每次 setReadOnly() 都发送真实 SQL 到 MySQL │ │ ↓ │ │ MySQL 会话状态与 JDBC 期望状态实时同步 │ │ ↓ │ │ 彻底解决三层状态机不一致问题 │ └─────────────────────────────────────────────────────────────────┘五、性能影响评估评估项结论额外网络开销每次setReadOnly()增加一次网络往返实际影响业务中setReadOnly()调用频率极低影响可忽略吞吐量影响生产经验表明通常 3%收益彻底消除偶发性只读事务异常稳定性大幅提升六、一句话总结在 Druid 连接池中配置useLocalSessionStatefalse通过 JDBC URL 或connectionProperties传递强制 MySQL JDBC 驱动每次状态变更都真实通知 MySQL彻底解决三层状态机不一致导致的“只读事务”异常。

相关文章:

MySQL 5.7.12 + Druid 连接池“只读事务”异常深度剖析(Cannot execute statement in a READ ONLY transaction)

一、故障现象 在 MySQL 5.7.12 环境下,使用 Druid 连接池的应用偶尔会抛出以下异常: Cannot execute statement in a READ ONLY transaction诡异特征: 偶发性出现,并非每次操作都复现conn.isReadOnly() 返回 false,但 …...

影刀RPA跨境店群自动化:分布式环境调度与高并发资源隔离架构实战

定了。在这场旷日持久的跨境电商反爬风控拉锯战中,我们终于用一套基于 Python 深度协同的分布式微服务调度架构,重塑了跨境千店矩阵的自动化底座。 这几天,科技圈被“DeepSeek V4 首发华为昇腾芯片,国产 AI 开始打破英伟达 CUDA …...

2026降AI率工具红黑榜:AI智能降重工具怎么选?用数据说话!

红榜优先选千笔AI、ThouPen、豆包,适配国内高校AI率检测规范;黑榜避开低质免费降AI工具、无正规检测对接、改写痕迹生硬的工具,优先按需求匹配三维模型(降AI效果-学术合规性-使用成本)。 一、红榜:10 款高分…...

纯血鸿蒙彻底告别安卓依赖:HarmonyOS 7.0 即将正式发布,国产操作系统迎来真正转折点

OpenHarmony 7.0 Beta1已经悄然上线GitCode,开发者体验官招募也同步启动。多数人还在讨论鸿蒙又更新了版本,但很少有人注意到这次更新的核心变化:纯血鸿蒙终于移除了对Android APK兼容层的依赖。这仅仅是一次常规版本迭代吗?还是国…...

Navicat Premium16 免费安装配置教程(附安装包) ​

一、下载安装包 官网下载:https://www.navicat.com.cn/products#navicat 可直接网盘下载 链接:https://pan.baidu.com/s/1t3Tx0c8gEaMEifGow_05aQ?pwd8888 二、安装过程 1. 双击安装包 ​ 2. 选中“我同意”,点击“下一步”。 ​ 3.…...

互联网大厂 Java 求职面试:从微服务到 AI 的探索之旅

互联网大厂 Java 求职面试:从微服务到 AI 的探索之旅 面试官:燕双非,欢迎你来到我们的面试。今天我们主要聊聊在电商场景下 Java 的微服务架构,你准备好了吗? 燕双非:准备好了,我觉得电商系统就…...

【AI面试八股文 Vol.3.5:推理幻觉规模定律】CoT、幻觉与 Scaling Law:为什么模型会推理,也会一本正经胡说

摘要:这篇会把 CoT、幻觉和 Scaling Law 放到同一条工程主线上:CoT 不是教模型思考,而是触发模型把隐式路径显式写出来;幻觉不是单一 bug,而是训练知识边界、解码策略和指令跟随压力叠加后的结果;Scaling L…...

macOS虚拟打印机:一键文档转PDF的高效解决方案

macOS虚拟打印机:一键文档转PDF的高效解决方案 【免费下载链接】RWTS-PDFwriter An OSX print to pdf-file printer driver 项目地址: https://gitcode.com/gh_mirrors/rw/RWTS-PDFwriter 在数字化办公环境中,将各类文档快速转换为PDF格式是日常工…...

【收藏干货】2026 版 11 款主流 AI Agent 框架全方位对比!程序员小白入门大模型必备选型指南

本篇整合当下热度顶尖的 11 款 AI Agent 开发框架,囊括 LangChain、AutoGen、CrewAI 等主流工具,新版补充实战落地要点与行业最新应用方向。围绕各框架核心特性、优缺点、适配场景展开深度比对,依托大语言模型搭建智能自主系统,可…...

气象水文耦合模式WRF-Hydro建模技术应用

WRF-Hydro模型是一个分布式水文模型,‌它基于WRF‌陆面过程部分独立发展而来,‌旨在模拟大气和水文相互作用及过程。该模型采用FORTRAN90开发,‌具有良好的扩展性和支持大规模并行计算的与传统水文模型相比,WRF-Hydro模型具有以下…...

智慧农业棉花棉铃病害成熟度检测数据集VOC+YOLO格式969张6类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):969标注数量(xml文件个数):969标注数量(txt文件个数):969标注类别数&…...

智慧农业棉花棉铃病害成熟度识别分割数据集labelme格式969张6类别

数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件)图片数量(jpg文件个数):969标注数量(json文件个数):969标注类别数:6标注类别名称:["jiankangmianling","qingdubinghai"…...

Dark Reader终极指南:轻松为任何网站开启完美深色模式

Dark Reader终极指南:轻松为任何网站开启完美深色模式 【免费下载链接】darkreader Dark Reader Chrome and Firefox extension 项目地址: https://gitcode.com/gh_mirrors/da/darkreader Dark Reader是一款广受欢迎的浏览器扩展,它能智能分析网页…...

企业级应用通过Taotoken实现AI能力冗余与故障转移设计

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 企业级应用通过Taotoken实现AI能力冗余与故障转移设计 在构建依赖大模型API的企业级应用时,服务的连续性与稳定性是核心…...

AI Agent游戏测试革命:自动生成10万+边界用例,覆盖率提升3.2倍——附可运行Python测试Agent源码

更多请点击: https://intelliparadigm.com 第一章:AI Agent游戏行业应用全景图 AI Agent 正在重塑游戏开发、运营与玩家体验的全生命周期。从智能NPC的行为建模,到自动化测试与关卡生成,再到实时个性化内容推荐与反作弊决策&…...

阿里云ACP云计算| 20人团考全员通过,恭喜!

...

餐饮门店AI Agent上线倒计时:错过Q3政策补贴窗口期,将多付47%算力成本(附工信部认证服务商名录)

更多请点击: https://kaifayun.com 第一章:餐饮门店AI Agent的核心价值与政策窗口期紧迫性 在人力成本持续攀升、消费者预期快速迭代的双重压力下,餐饮门店正面临从“经验驱动”向“智能协同”跃迁的关键拐点。AI Agent 不再是实验室概念&am…...

【限时解密】Lindy自动化方案未公开的4层权限熔断机制:为什么92%的企业跳过这步就触发合规雷区?

更多请点击: https://kaifayun.com 第一章:Lindy人力资源自动化方案的合规性底层逻辑 Lindy人力资源自动化方案并非简单地将流程数字化,而是以全球主流劳动法规为约束边界,将合规性内化为系统架构的刚性层。其底层逻辑建立在“规…...

数据网格(Data Mesh):下一代数据架构的核心思想与实践

在数字化转型的浪潮中,数据已成为企业最核心的资产。然而,传统的数据架构,如集中式数据湖和数据仓库,正面临着前所未有的挑战:数据孤岛林立、数据质量参差不齐、业务响应缓慢、维护成本高昂。这些问题严重制约了企业数…...

学习笔记·敏捷开发

“嗨,阿米戈!” “嗨,比拉博!” “今天我要给大家讲讲程序通常是怎么开发的。” “在 20 世纪,当现代 IT 还处于起步阶段时,每个人似乎都认为编程就像建筑或制造。” “事情通常是这样的:” “客户会解释他需要的程序类型——它应该做什么以及应该如何做。” “业…...

Beyond Compare 5密钥生成器:从评估到期到永久授权的完整解决方案

Beyond Compare 5密钥生成器:从评估到期到永久授权的完整解决方案 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 你是否在使用Beyond Compare 5进行文件对比时,遇到了30…...

Poppler Windows版:终极PDF处理方案,3分钟零配置部署指南

Poppler Windows版:终极PDF处理方案,3分钟零配置部署指南 【免费下载链接】poppler-windows Download Poppler binaries packaged for Windows with dependencies 项目地址: https://gitcode.com/gh_mirrors/po/poppler-windows 还在为Windows上复…...

如何通过NVIDIA Profile Inspector深度优化游戏性能:解锁显卡隐藏设置的完整指南

如何通过NVIDIA Profile Inspector深度优化游戏性能:解锁显卡隐藏设置的完整指南 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 你是否曾经感到困惑,为什么同样的显卡配置&…...

CPU压力测试

工具环境:python3运行环境:SOC端内部测试用途:给SOC的CPU单个核以及MEM加压文件说明以及主要用法:""" CPU Loader """import os import sys import time import math import signal import argpars…...

戴森球计划终极蓝图指南:从新手到专家的完整工厂建设方案

戴森球计划终极蓝图指南:从新手到专家的完整工厂建设方案 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints FactoryBluePrints是戴森球计划玩家必备的工厂蓝图仓库…...

8051MX内存溢出问题解析与解决方案

1. 问题背景与现象分析最近在移植一个基于Philips 8051MX架构的老项目时,遇到了一个典型的地址空间溢出问题。项目原本使用标准8051架构,现在需要迁移到支持更大内存空间的8051MX平台。我选择了ROM模型中的HUGE模式,这种模式下程序代码可以存…...

Agent怎样做到在信创环境全栈兼容?2026企业级智能体信创适配技术全解析

进入2026年,随着信创(信息技术应用创新)产业进入深水区,企业数字化转型已不再仅仅是简单的“去IOE”或系统迁移,而是演变为以AI Agent(智能体)为核心的新型生产力重构。在这一背景下&#xff0c…...

代数拓扑运算流程

文章目录0、背景一、标准计算流程:以单纯同调为例空间剖分,构建单纯复形‌生成各维度链群‌定义边界算子‌定义闭链群与边缘链群‌计算同调群并解读拓扑信息‌推导最终拓扑结论‌二、其他核心概念的典型计算逻辑0、背景 之前为了做一个东西学习TDA&…...

一句指令就能完成跨系统操作?——2026企业级智能体技术路径深度拆解

站在2026年的时间节点回望,企业数字化转型已从“流程驱动”全面转向“智能体驱动”。过去,跨系统操作往往意味着繁杂的API对接或编写脆弱的自动化脚本。而今,以实在智能推出的实在Agent为代表的方案,实现了“一句指令,…...

QLoRA:4-bit 量化微调的完整链路

本文基于昇腾CANN和昇腾NPU,围绕 cann-recipes-train 仓库的相关技术展开。 QLoRA 不是简单的 LoRA 量化。它在 LoRA 的冻结权重上做了 NF4 量化,同时保留了 LoRA 适配器的 FP16 精度。CANN 上部署 QLoRA 模型时,NF4 的反量化要在 NPU 上做&…...