【问题标题】:transaction not working in laravel事务在 laravel 中不起作用
【发布时间】:2018-04-14 00:52:03
【问题描述】:

我在 laravel 中的交易有问题。 当我尝试使用以下代码执行此操作时,屏幕上会出现错误,好像我没有交易一样。

\DB::transaction(function() use ($movement, $movementRows) {
   $movement->save();
   $movement->rows()->saveMany($movementRows);
});

当我尝试使用下面的代码执行此操作时,第一个对象被保存,尽管第二个对象失败。

\DB::beginTransaction();
try {
     $movement->save();
     $movement->rows()->saveMany($movementRows);
      \DB::commit();
      $success = true;
} catch (\Exception $e) {
    $success = false;
    \DB::rollback();
}

if ($success) {
    // the transaction worked ...
}

【问题讨论】:

  • PHP 7.1.7。 Laravel 5.1
  • 出现什么错误?
  • 查询出了什么问题,我的测试使用了错误的外键。

标签: php database laravel transactions controllers


【解决方案1】:

确保您使用的是支持事务的引擎。 InnoDB 支持事务,但 MyIsam 不支持。因此,例如在 PhpMyAdmin 中打开您的数据库,并确保所有表都设置为 InnoDB 而不是 MyISAM(假设您使用的是 MySQL - 您没有提到您使用的数据库)。

【讨论】:

  • 是的,我使用的是 MySQL,表引擎是 InnoDB
  • 好的,你使用的是最新的 Laravel 5.1 版本吗?对于第一个代码异常没有被捕获,它们只回滚事务并重新抛出异常。在这两种情况下,事务都应该起作用。抛出了什么确切的异常?您 100% 确定,该移动记录是在此处创建的吗?
  • Laravel 框架版本 5.1.46 (LTS)。我在第一个代码中写了一个 try-catch 部分,并且发生了同样的事情:即使第二个记录失败,也会保存第一个记录
  • 好的,但正如我所说,确切的例外是什么?也许确定这里发生了什么很重要,因为通常它应该可以正常工作。
  • PDOException {#664 #message: "SQLSTATE[23000]: 完整性约束违规:1452 无法添加或更新子行:外键约束失败 (siie_cartro.wms_mvt_rows, CONSTRAINT @ 987654323@ 外键 (item_id) 引用 erpu_items (id_item) 删除级联)"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多