使用Eloquent进行Laravel 5事务处理

5

我正在使用MySQL的MyISAM引擎,我想在这里使用事务,这是我的代码:

DB::transaction(function () {
    $project = Project::find($id);
    $project->users()->detach();
    $project->delete();
});

这段代码执行成功,但我不确定事务是否起作用... 我该如何测试它?


MyISAM引擎不支持事务。每个查询都是原子的。如果您需要事务,则必须使用InnoDB或NDB等支持事务的其他引擎。您可能在搜索Laravel mysql事务时找到了这个问题,但是问题的最初假设只能回答为“除非将表转换为InnoDB,否则不可能”。 - gview
2个回答

17

实际上只有两种做法,但两者都不是特别好的选择,因为DB::transaction不会报告错误。

  1. 在闭包内部放置 try/catch 块,并在 catch 块中设置一个外部变量以便在事务失败时进行处理。

  2. 进行手动事务,使用DB::beginTransaction和回滚/提交,同样需要一个异常处理程序,如下面的示例:

    DB::beginTransaction();
    try {
        $project = Project::find($id);
        $project->users()->detach();
        $project->delete();
        DB::commit();
        $success = true;
    } catch (\Exception $e) {
        $success = false;
        DB::rollBack();
    }
    
    if ($success) {
        // the transaction worked carry on...
    }

我不关心错误报告,我只需要确保两个查询总是一起运行...你能给我展示一个手动事务的例子吗? - Vladimir Djukic
对于仍在访问此问题的人,DB::rollBack(); 应该使用大写字母 B。 - Roi

3
这个问题很老了,但我认为使用MyISAM存储引擎无法实现事务。最新的MySQL服务器版本是5.7,相应的参考指南说明MyISAM存储引擎不支持事务。如果我没记错的话,begin、commit和rollback语句可以正常接受,但行为与预期不同。请参考https://dev.mysql.com/doc/refman/5.7/en/myisam-storage-engine.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接