2.2.1 MySQL 持久化修复
修复被动技能书后连接事务遗留导致的保存未提交与重启丢宠,含真实 MySQL 复现和重启验证。
修复 MySQL 模式下“新宠物显示保存成功,断线或重启后却消失”的一条已复现路径。问题来自被动技能书学习/升级后连接遗留的手动提交状态,与主动技能自动释放无关。
触发条件与表现
被动技能书调用 learnSkill 时会开启事务。旧版在提交或回滚后将连接归还连接池,但没有恢复自动提交状态。后续捕捉或创建宠物借到同一连接时,INSERT 虽然返回成功,实际写入仍未提交。
同一连接能读到这只宠物,独立连接却读不到;连接断开、连接池关闭或后续事务回滚时,新记录消失。连接池有多个连接时,取到哪条连接决定是否遇到问题,因此会表现为偶发丢失。既有宠物的属性更新和背包写入也可能受未提交事务影响,读取还可能停留在旧事务快照。
此次已用旧版 2.2.0 成品 Jar 和真实 MySQL 8.0.45 稳定复现:先保存宠物 A,再学习被动技能,随后保存宠物 B;B 返回 CREATED,同一连接可见、独立连接不可见,关闭并重开仓库后 B 消失,A 仍在。
修复内容
- 归还连接时发现
autoCommit=false,先执行rollback,再恢复autoCommit=true。不能直接开启自动提交,以免把上一次操作遗留的失败事务意外提交。 - 恢复连接初始的只读状态和事务隔离级别,并清除旧警告;新建连接借出前也校正事务状态。
- 回滚或任何状态恢复失败时,立即关闭并丢弃该物理连接,后续操作使用新连接。
- 连接池关闭与连接归还入队互斥,避免关闭后仍遗留空闲连接;建连途中遇到关闭也不会继续借出新连接。
不更改数据库表结构,不迁移宠物记录,不覆盖管理员配置。112 项主动技能、每宠三槽、CE 配方捕捉和已有模型动画功能保持原有配置。
验证结果
本次 Maven 构建成功,688 项单元测试全部通过,失败、错误和跳过均为 0;其中新增 13 项连接池回归测试,包含真实 SQLite 事务持久化、恢复失败与关闭竞态验证。
| 真实 MySQL 检查 | 结果 |
|---|---|
| 旧版 2.2.0,连接池大小 1 | 8 项检查确认缺陷可复现 |
| 修复版 2.2.1,同一 MySQL 环境 | 33 项检查通过,保存成功后独立连接立即可见,仓库重开后仍存在 |
| 真正停止并重启 MySQL,启动新的 Java 验证进程 | 4 项检查通过,宠物、名称、背包与被动技能保留 |
真实数据库共执行 45 项检查,其中修复后与重启验证合计 37 项。环境为独立的 MySQL Community Server 8.0.45、Connector/J 9.2.0,仅使用本机独立数据目录和测试数据,未连接生产数据库。
覆盖被动技能学习、升级、已满级回滚和宠物不存在回滚后的新增/更新/删除/背包写入,独立连接可见性、旧读取快照释放、乐观锁冲突、未完成事务回滚、只读状态恢复,以及杀掉空闲连接后的重连。用于验证的 2.2.1 Jar SHA-256 为:
E5F45529366C5194250F9D879FF5ECA676BBB184060D7BFAF2718C4547EF8078
这次针对数据库仓储与连接池直接测试成品 Jar,不把 2.2.0 的模型动画或服务端技能验收数字算作本次重跑结果。
升级与已有数据
请正常停服后替换为 2.2.1 Jar,再启动确认日志显示 Enabling LiPet v2.2.1;热重载不能替换已加载的连接池代码。数据库表结构与配置不需要修改。
本次修复防止后续写入因连接事务状态遗留而丢失,不能自动恢复已经回滚的新宠物。已有缺失记录仍需结合对应服务器的数据库备份和日志核实,不能凭空补出原宠物数据。
本机 F:/26.2 当前配置使用 SQLite,并非用户报告问题的 MySQL 现场;本机记录检查和隔离数据库测试不代表已检查或修复用户的生产 MySQL 数据。2.2.1 的交付目录为 F:/26.2/待更新/LiPet-2.2.1,该目录中的文件不代表运行服已加载新版。