Laravel Eloquent ORM 事务:为啥我们需要 ROLLBACK?

Posted

技术标签:

【中文标题】Laravel Eloquent ORM 事务:为啥我们需要 ROLLBACK?【英文标题】:Laravel Eloquent ORM Transactions: Why we need ROLLBACK?Laravel Eloquent ORM 事务:为什么我们需要 ROLLBACK? 【发布时间】:2019-08-29 11:31:03 【问题描述】:

当我们可以在不使用它的情况下执行多个查询时,为什么我们需要DB::rollback()。如:

DB::beginTransaction();
 //database queries here

 //even if any errors pop up here, it won't reach DB::commit() and code won't get committed
DB::commit();

在上述情况下,即使任何语句失败,commit 也永远不会命中,事务也不会处理。所以回滚是不需要或强制的?

【问题讨论】:

所以你在这里问为什么 mysql 需要/需要 ROLLBACK.. 理想情况下,该代码可以在 try catch 块中.. 是的。我知道它必须在try-catch中。我只是建立一个例子。但回滚仍然是强制性的吗? “但回滚仍然是强制性的吗?” 在查看 MySQL 服务器的一些源代码部分之后...... MySQL (innoDB) 对死锁和或如果可能(SQL)错误发生在执行线程上,就像我预期的那样。所以不,这不是强制性的,但做一个明确的ROLLBACKDB::rollback())也没有什么坏处......事实上我建议你在代码中运行DB::rollback(),这样代码就变得更清楚幕后发生了什么...... 假设你在一个事务中有 100 个查询,它们都成功了,但是系统的不同部分产生了错误,比如邮件发送失败或支付失败,或者其他什么问题都没有做数据库。现在您要清理并恢复这 100 个查询所做的更改。无需手动清理,您只需 ROLLBACK; 即可回滚数据库的状态。 @RaymondNijland 非常感谢您提供的信息! 【参考方案1】:

通常不使用回滚,以便在发生错误时停止当前流程,但使用回滚是为了撤消您对事务或数据库所做的任何更改,直到错误点。

因此,这不是强制性的,但强烈建议只保留相关数据。

【讨论】:

“一般来说,不使用回滚,因此如果发生某些错误,您的当前流程会停止。” MySQL (innoDB) 对死锁和/或执行隐含 ROLLBACK执行线程上可能发生 (SQL) 错误。【参考方案2】:

回滚 在我的情况下,当我使用付款流程时,我使用回滚,例如在该用户必须使用 Paypal 帐户支付注册费后,我必须创建具有完整信息的用户,如果它未能支付用户信息将被回滚

【讨论】:

【参考方案3】:

回滚的使用:-

DB::beginTransaction();
try
  //save in table 1

  //save in table 2

  //save in table 3....with a sql error
DB::commit();
catch()

DB::rollback(); //if rollback due to error occurs in query 3 then no data will be saved in table 1 and 2...Not Mandatory


【讨论】:

以上是关于Laravel Eloquent ORM 事务:为啥我们需要 ROLLBACK?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Eloquent ORM 执行 MYSQL 事务

我想将 MySQL 查询转换为 Laravel Eloquent / Laravel ORM

来自 SQL 的 Laravel Eloquent ORM 聚合函数

Laravel Eloquent ORM 数据model操作

我收到此错误:类 Illuminate\Database\Eloquent\Builder 的对象无法在 laravel ORM 中转换为字符串

Laravel 4 Eloquent ORM:虚拟表/视图 - 有可能吗?