【问题标题】:MySQL Transaction doesn't rollback with 0 affected rows - LaravelMySQL 事务不会回滚 0 个受影响的行 - Laravel
【发布时间】:2022-01-27 09:27:08
【问题描述】:

我尝试让我的第一个查询返回 affected rows: 0 以查看事务是否失败,但它继续执行第二个查询。

我应该手动中断交易吗?

DB::transaction(function () {
  User::where('id', 1002)->update(['name' => 'x']); // id:1002 doesn't exist

  Post::where('user_id', 1)->update(['title' => 'New Title']);
});

【问题讨论】:

  • 为什么会失败?
  • 它没有失败,只是没有找到要更新的内容。在尝试第二个查询之前,您可能希望在第一个查询中检查受影响的行。
  • @aynber 如果给定的 id 存在,但 MySQL 仍然以某种方式返回 0,会发生这种情况吗?
  • @lagbox 请阅读我上面的评论。
  • 如果没有变化,可能会发生这种情况。所以如果 1002 存在,但名字已经是 x,那么就没有受影响的行。

标签: php mysql laravel


【解决方案1】:

您的示例代码周围没有很多上下文,但一个非常基本的方法是这样的:

$user = User::findorFail(1002);
$user->update(['name' => 'x']);
if ($user->wasChanged('name')) {
    Post::where('user_id', 1)->update(['title' => 'New Title']);
}

因此,如果找不到模型,第一行将引发异常。然后我们进行更新。你特别说你正在检查 0 个受影响的行,所以接下来我们使用the wasChanged() method。它“确定在当前请求周期内上次保存模型时是否更改了任何属性。”如果是这种情况,我们将继续进行下一次更新。

如果问题中显示了更多代码,还可以进行其他更改,例如 route model binding,但希望这是一个有用的开始。

【讨论】:

    猜你喜欢
    • 2021-04-06
    • 2016-01-19
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 2013-07-08
    • 1970-01-01
    相关资源
    最近更新 更多