【问题标题】:Laravel Nested DB TransactionsLaravel 嵌套数据库事务
【发布时间】:2022-01-19 07:43:54
【问题描述】:

我对 Laravel 嵌套事务进行了一些挖掘,但我仍然很困惑,基本上在我的代码中,我有一个调用函数,它调用多个其他函数,并且被调用的函数变成了调用,它们调用了其他多个函数等,例如

public function A()
{
    $this->B();
    $this->C();
}

public function B()
{
    $this->D();
    $this->E();
}

public function C()
{
    $this->F();
}

我想要实现的是,每当发生 DB 异常时,我都想回滚调用和被调用函数中的所有事务,所以我只想知道我必须在哪里开始事务和结束,这意味着我应该在哪里开始事务每个单独的函数或根函数,以及如何将异常从被调用函数传递给调用函数,希望你们能明白我的意思

【问题讨论】:

  • 如果你将代码包装在 DB::transaction(function ...) 中,那么 Laravel 应该会为你处理事情。
  • 感谢您宝贵的时间和帮助,因此您希望我在作为调用函数的函数 A 中只开始一个 Db 事务,并且每当在被调用函数(等 B()、C ()) 比我应该返回它调用函数并回滚所有事务。 public function A() { DB::transaction(function () { $this->B(); $this->C(); }); } public function B() { $this->D(); $this->E(); } public function C() { $this->F(); } 如果我是正确的,那么这比这更有效
  • 如果发生异常并且未处理所有事务应回滚。但是,如果您执行function B() { try { $this->D(); } catch(Exception $e) { /* do something */ } $this->E(); },那么如果D() 引发异常,则假设存在嵌套事务支持,则只有D 中的事务将被回滚,我认为MySQL 确实支持InnoDB。如果你的 DBMS 不支持嵌套事务,那么 Laravel 实际上只会启动一个事务,所以在这种情况下你可能会遇到一些不一致的行为。

标签: mysql laravel database transactions


【解决方案1】:

为什么不干脆做

public function A()
{
    $this->D();
    $this->E();
    $this->F();
}

这样您就可以将DB::transaction(function ...) 放在所有3 个A()B()C()

【讨论】:

  • 好的,再次感谢
  • @NabeelHassan 如果它解决了您的问题,请将其标记为“答案”以结束您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-19
  • 2021-04-01
  • 2013-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多