nadirabbas/laravel-transaction-commit-queue

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

dev-master 2022-09-24 16:58 UTC

This package is auto-updated.

Last update: 2024-08-24 20:55:37 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。详细信息请参阅LICENSE.txt文件。