【发布时间】: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