laravel 10 中事务失败时执行一些操作

问题描述 投票:0回答:1

在 Laravel 中事务失败后,存在某种方法可以执行某些操作吗?我知道可以使用 try/catch,但事务内部还有其他委托指令,它们已经使用了 try/catch 语句。

DB::transaction(function () {
    $this->otherService->Create($data);
});
  
class OtherService
{
    public function Create(){
      try{
       //Some database operations
      }catch(Exception $e){

      }
    }
}

我需要帮助,谢谢!

laravel database transactions
1个回答
0
投票

如果您想处理失败的事务而不直接在事务周围使用

try/catch block
,您可以利用数据库事件和观察者。 Laravel 提供了
TransactionCommitted
TransactionRolledBack
事件,您可以监听并执行操作。这可以避免直接在事务代码周围放置 try/catch 块。

创建一个监听

TransactionRolledBack
事件的观察者:

php artisan make:observer TransactionFailedObserver --queued

TransactionFailedObserver
类中,处理回滚事件:

use Illuminate\Database\Events\TransactionRolledBack;

class TransactionFailedObserver
{
    public function __construct()
    {
        //
    }

    public function failed(TransactionRolledBack $event)
    {
        // Logic to execute when a transaction fails
        // You can add your desired actions here, such as logging or additional operations
        
        // Example: Log the exception
        logger()->error('Transaction failed: ' . $event->exception->getMessage());
        
        // Example: Rollback another related action
        // Your code here...
    }
}

EventServiceProvider
中注册观察者:

protected $listen = [
    'Illuminate\Database\Events\TransactionRolledBack' => [
        'App\Observers\TransactionFailedObserver@failed',
    ],
];

无需

try/catch block
即可触发交易:

use Illuminate\Support\Facades\DB;

DB::transaction(function () use ($data) {
    $this->otherService->create($data);
});
© www.soinside.com 2019 - 2024. All rights reserved.