【问题标题】: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 非常感谢您提供的信息!

标签: php mysql sql laravel-5


【解决方案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
    
    }
    

    【讨论】:

      猜你喜欢
      • 2013-02-12
      • 2022-01-13
      • 1970-01-01
      • 2018-03-08
      • 1970-01-01
      • 2019-06-09
      • 1970-01-01
      • 2010-11-24
      • 2014-06-18
      相关资源
      最近更新 更多