Codeigniter框架下MYSQL已存数据偶尔页面显示为空问题咨询
可能原因
- 事务相关问题
- 写入操作的事务未提交就触发读请求:如果写入逻辑使用了数据库事务,且事务提交操作在页面跳转、读请求触发之后执行,写完立刻读时事务还未落地,数据库就不会返回对应数据,第二次刷新时事务已经提交完成,数据即可正常返回。
- 读事务开启时机过早:如果读请求逻辑开启了长事务,或者事务开启时间早于写入操作完成时间,在MySQL默认的可重复读隔离级别下,读事务会复用事务开启时的快照,读不到后续写入的新数据,第二次请求开启新事务后即可正常读取。
- 主从同步延迟
如果部署架构使用了MySQL主从分离,写操作走主库、读操作走从库,刚写入的数据还未同步到从库时触发读请求,就会拿到空结果,同步完成后再刷新就能正常获取数据。该场景的典型特征就是偶发无规律,和从库同步延迟时长直接相关,可临时将读请求切到主库测试,若问题消失即可定位为该原因。 - 缓存类问题
- 前端GET请求缓存:当前AJAX使用
GET方法发起请求,浏览器默认会对相同参数的GET请求做缓存。如果数据写入前曾发起过相同参数的请求拿到了空结果,写入完成后再发起请求会直接复用之前的缓存,导致返回空值。可将请求方法改成POST,或者在GET请求参数中添加随机时间戳禁用缓存,示例:data:{bill_no:bill_no, t: Date.now()}。 - Codeigniter数据库查询缓存:如果开启了CI框架自带的数据库查询缓存,查询结果会被缓存到本地文件,写入数据后缓存没有及时更新,第一次读会拿到旧的缓存结果,缓存过期后再请求即可拿到最新数据。可临时在查询前添加
$this->db->cache_off();关闭缓存测试是否复现。 - 服务端其他缓存:若使用了nginx接口缓存、Redis查询结果缓存等组件,缓存更新不及时也会出现该问题,排查所有缓存层的过期策略、写入后的更新逻辑即可。
- 前端GET请求缓存:当前AJAX使用
- 查询逻辑异常
检查Controller层的查询逻辑,是否存在变量初始化异常、查询条件偶发赋值错误的问题,比如bill_no参数偶尔没有正确接收、关联查询的关联条件偶发失效,导致部分字段查询为空。可以在接口返回前添加日志,把每次的入参、执行的SQL、原始查询结果都打印到日志中,出现空值时对比日志即可定位是否是查询环节的问题。 - JSON编码异常
如果result字段存在特殊字符(比如不可见控制字符、非UTF-8编码内容),json_encode处理时会将该字段置为空值。你可以在json_encode执行前打印原始查询结果,对比编码前后的输出,确认是否是编码环节的问题,对特殊字符提前做转义或者编码转换处理即可解决。
内容的提问来源于stack exchange,提问作者TDJ
相关产品推荐
相关产品推荐

