Laravel中Model::create()使用InnoDB存储引擎时无法插入数据问题
问题解决
核心原因
该现象由InnoDB事务特性和MySQL自增ID机制共同导致,MyISAM不支持事务所以运行正常:
- InnoDB的自增锁申请后不会随事务回滚回收,因此每次插入都能拿到递增的新ID
- 插入操作执行后事务未正常提交,数据随回滚被清理,因此库中无对应记录
排查步骤
- 优先检查事务逻辑:
- 查看当前控制器或全局中间件是否手动开启了事务(调用了
DB::beginTransaction()),但没有对应DB::commit()提交逻辑 - 你代码中的
dd($customer->id)会直接终止程序运行,若插入操作在事务内执行,程序终止后事务会自动回滚,数据不会落盘
- 查看当前控制器或全局中间件是否手动开启了事务(调用了
- 快速验证方案:
将提交逻辑放在打印语句前,测试数据是否正常入库:$customer = Customer::create([ 'name'=>$request->customerName, 'email'=>$request->customerEmail, 'phone'=>$request->customerPhone, 'area_id'=>$request->customerArea, 'gender'=>$request->customerGender ]); DB::commit(); // 事务开启场景下必须手动提交 dd($customer->id); - 次要排查点:
- 检查
customers表是否存在未赋值的必填非空字段,触发严格模式报错导致事务回滚 - 检查Customer模型是否注册了
creating/save事件回调,回调返回false中断了写入流程 - 确认数据库账号对InnoDB引擎表有写入权限,无权限操作会触发隐式回滚
- 检查
内容的提问来源于stack exchange,提问作者CairoCoder
相关产品推荐
相关产品推荐

