我单独开发了一个在线游戏,花了整个下午debug最傻的bug。玩家们一直在报告他们的角色“重置”到默认状态。有的人说这是发生了几次。所以我登录,设置了一个角色,重新加载,没问题。硬重新加载,还是没问题。重新部署到本地环境,还是没问题。我花了很长时间检查装备端点、客户端状态和“写入是否持久化”的兔子洞。所有的都正常。角色保存和读取都正确。我的最大玩家(我的妈妈lol)说这是发生在她每天晚上吃饭的时候,我终于意识到这是我通常推送更新的时候。然后我检查了我的DB init,在每个服务器启动时运行的CREATE TABLE IF NOT EXISTS …语句中发现了一个遗留的早期迁移代码:UPDATE profiles SET avatar = 'peep1' WHERE avatar NOT IN ('peep1','peep2', … ,'peep15');当我写了这个代码时,那15个是唯一的角色。然后我添加了~30个商店角色玩家在游戏中使用虚拟货币购买的角色,我从来没有触摸过这个行。所以在每个服务器启动时,它会“有助地标准化”每一个角色回默认状态。所以每次部署都是一个静默的大规模角色重置。它没有删除角色,但删除了装备的选择。它只在启动时触发,这就是为什么它在单个会话中从未重现。修复方法是删除这个查询。一个我应该早就想到的教训...... 不条件的破坏性查询在启动时运行可能不是一个好主意lol。也许应该在启动时运行一次,应该被门控,而不是永久存储在启动路径中。(这是一个没有构建步骤的微型多人单词游戏,运行在一个小服务器上)