【发布时间】:2020-01-31 14:01:56
【问题描述】:
任何人都有在一个队列中使用具有多个数据库事务的 laravel 作业的经验吗? laravel 支持吗? 我有一个问题,我有 2 个不同的数据库连接,即数据库 A 和数据库 B,当我使用数据库 A 发送我的第一份工作时,一切正常,我的所有数据都正确插入,但是当我使用数据库 B 发送我的第二份工作时,事务不提交,根本没有数据插入 我需要重新启动工人然后它会再次工作。 我使用 redis 作为队列驱动程序。
数据库 A 事务
$valid = true;
DB::beginTransaction();
try {
//some logic happen here if got error $valid will be false
//if valid true commit else rollback
$valid ? DB::commit() : DB::rollback();
} catch (Exception $e) {
$valid = false;
DB::rollback();
}
数据库 B 事务
$valid = true;
DB::beginTransaction('b-connection');
try {
//some logic happen here if got error $valid will be false
//if valid true commit else rollback
$valid ? DB::connection('b-connection')->commit() : DB::connection('b-connection')->rollback();
} catch (Exception $e) {
$valid = false;
DB::connection('b-connection')->rollback();
}
我如何分派工作
DeliveryOrderJob::dispatch($data)->onConnection('swift')->onQueue('do');
基本上两者使用相同的逻辑,唯一不同的是数据库连接。请帮忙。
【问题讨论】:
-
这是分布式事务的问题。
-
@TsaiKoga 你能详细说明一下吗
-
对不起,我误会了,我以为你想在一个队列多级中做两个 diff 事务。但是,你做两个 diff 工作来做两个 diff 事务,我认为你的队列可以工作。跨度>
-
你使用
php artisan queue:work?如果你运行这个命令,你需要知道这个命令在你改变它之后不会再次加载你的代码。因此,如果您更改了b-connection代码,则需要重新启动队列命令,它将起作用 -
我为此使用
horizon,我已经重新启动队列,但仍然是同样的问题,根本没有错误,database A一切正常,但database B根本没有提交,然后我重新启动我的队列然后它工作,但在我跑回来database A然后database B不再工作
标签: laravel