Linux服务器Laravel+MariaDB插入数据后立即查询无新数据求助
问题根因定位
该问题90%以上是读写分离场景下主从同步延迟+Laravel默认读请求路由规则导致的,本地为单节点数据库无主从架构,因此不会复现。
解决方案
1. 优先调整Laravel数据库配置(无需修改数据库配置,优先推荐)
如果你的项目配置了读写分离,在config/database.php的MariaDB连接配置中开启sticky选项即可:
'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), // 原有其他配置保持不变 'read' => [ 'host' => [env('DB_READ_HOST', '127.0.0.1')], ], 'write' => [ 'host' => [env('DB_WRITE_HOST', '127.0.0.1')], ], 'sticky' => true, // 新增该行开启sticky规则 ],
sticky开启后,同一个请求生命周期内只要执行过写入操作,后续所有读请求都会自动路由到主库,完全避免刚写入就查询从库遇到的同步延迟问题。
2. 未配置读写分离时调整MariaDB事务隔离级别
如果没有使用读写分离,问题大概率是Linux默认MariaDB的事务隔离级别导致的。Linux环境下MariaDB默认隔离级别为REPEATABLE-READ(可重复读),如果插入和查询逻辑分布在两个不同的未提交事务中,就会出现看不到新数据的情况,可以调整为READ-COMMITTED(读已提交)解决:
- 编辑MariaDB配置文件,通常路径为
/etc/my.cnf或/etc/mysql/mariadb.conf.d/50-server.cnf - 在
[mysqld]配置段下新增规则:
transaction-isolation = READ-COMMITTED
- 重启MariaDB服务生效:
systemctl restart mariadb
3. 兜底检查项
- 确认插入操作执行后已经完成事务提交,无遗漏
commit()调用 - 低版本Laravel确认未开启查询缓存,可在查询逻辑中加
->withoutCache()测试 - 确认未开启跨请求的数据库持久连接,避免前一个请求的未回滚事务污染后续请求
内容的提问来源于stack exchange,提问作者dang quang hai
相关产品推荐
相关产品推荐

