jlorente/laravel-transaction-commit-queue

一个 Laravel 队列连接器,用于在事务提交成功后处理作业

1.0.4 2021-08-23 08:04 UTC

This package is auto-updated.

Last update: 2024-09-18 17:53:07 UTC


README

一个 Laravel 队列连接器,用于在成功的数据库事务提交后处理作业。

此连接器与“同步”连接器非常相似,区别在于作业是在数据库事务提交后执行,而不是立即执行。

例如,当发送导致其他进程或第三方应用程序从您的数据库中读取数据的通知时,它非常有用。当使用数据库事务并发送通知时,如果有其他队列连接器,则无法保证这些进程或第三方可以在您发送通知时找到您设置的数据,因为事务可能尚未提交。使用此连接器,当数据库事务级别达到“0”时,将发送通知。

安装

安装此扩展的首选方法是通过 composer

安装 Composer 后,您可以使用以下命令安装扩展

$ php composer.phar require jlorente/laravel-transaction-commit-queue

或添加

...
    "require": {
        "jlorente/laravel-transaction-commit-queue": "*"
    }

到您的 composer.json 文件的 require 部分。

配置

在您的 config/app.php 服务提供者列表中注册 ServiceProvider。

config/app.php

return [
    //other stuff
    'providers' => [
        //other stuff
        Jlorente\Laravel\Queue\TransactionCommit\TransactionCommitQueueServiceProvider::class,
    ];
];

然后添加驱动到应用程序配置队列文件中。

config/queue.php

return [
    //other stuff
    'connections' => [
        //other stuff
        'transaction-commit' => [
            'driver' => 'transaction-commit',
        ],
    ],
];

并发布配置文件。

$ php artisan vendor:publish --provider='Jlorente\Laravel\Queue\TransactionCommit\TransactionCommitQueueServiceProvider'

用法

有关如何使用作业和队列的说明,请参阅 Laravel 文档

以下是一个使用此队列的基本示例。

DB::transaction(function() {
    // Do something

    dispatch(function() use ($model) {
        $model->notify();
    })->onConnection('transaction-commit');
});

在这里,指定的回调作业将在事务提交后延迟执行。

在嵌套事务中调度作业

您可以在嵌套事务中调度作业到这个队列,并且作业将在所有事务解决并且提交到数据库后处理。

class ProcessExample {
    public function run() {
        DB::transaction(function() {
            // Do something more

            $this->nestedRun();
        });
    }

    public function nestedRun() {
        DB::transaction(function() {
            $model = new NotifiableExampleModel();

            // This job will be fired when all the transactions have been commited.
            dispatch(function() use ($model) {
                $model->notify();
            })->onConnection('transaction-commit');
        });
    }
}

$command = new ProcessExample();
$command->run();

在这个示例中,作业是在嵌套Run方法中创建的事务上调度,但此方法是另一个事务内部run方法的调用。$model->notify()回调的执行将延迟到所有事务都提交。

多个数据库连接

队列驱动程序将使用在数据库配置文件中定义的连接名称来为每个连接创建不同的队列。

如果您未指定调度作业的队列,则将使用默认队列,并且队列将在默认连接达到事务级别为0时处理。

如果您想在默认连接之外的其他数据库连接中初始化事务,请记住在发送到transaction-commit-queue的调度作业中指定带有连接名称的队列,如下例所示。

DB::connection('other-connection')->transaction(function() {
    // Do something
    $model = new NotifiableExampleModel();

    dispatch(function() use ($model) {
        $model->notify();
    })->onConnection('transaction-commit')->onQueue('other-connection');
});

测试

如果您使用事务回滚策略进行数据库测试,则可以设置环境变量 TRANSACTION_COMMIT_DISPATCH_INSTANTLY 以在事务提交而不是在事务提交时立即调度作业。

进一步考虑

如果没有打开数据库连接上的事务,则作业将立即执行。

如果事务回滚,则将被回滚的连接的所有挂起作业将被丢弃。

请记住,通知 也可以排队。

许可

版权所有 © 2020 José Lorente Martín jose.lorente.martin@gmail.com

在BSD 3-Clause 许可下授权。详细信息请参阅 LICENSE.txt。