Observer 如何配合数据库事务使用

环境: laravel 8.5

经典场景需求,删除用户,同时删除用户发布的文章。

1, 控制器里删除用户
public function destroy(User $user) {
$user->delete();
}
2, observer里删除用户发布的文章之类
public function deleted(User $user) {
// 删除用户的文章
}

但,有个问题。 如果删除完用户,刚好数据库挂了,导致用户发布的文章并没有被删除。 那么,这些文章在系统里就变成了孤魂野鬼,无主文章。就需要定期查找清理来应对。

在比如一种更严谨的场合,需要审计修改记录。用户发布了一个帖子,修改了标题。 审计log需要记录原标题是啥,新标题是啥。 这种用observer也是同样问题。 如果控制器里update完了,而observer里没有执行,就会发生用户改了标题而审计log没有记录的大问题。

那是不是这种需要数据库事务的场景,就不适合observer? 只能直接在控制器里
DB::transaction {
// 删除用户
// 删除文章
}

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

同步场景下依然可以用事务包裹来到达目的,异步队列场景下数据库挂了会有异常队列任务可以重试。 再说如果生产环境下数据库都挂了,你还在关心这并没有什么影响的一点冗余数据吗

1年前 评论
wpcolor (楼主) 1年前
Y90 1年前
wpcolor (楼主) 1年前
讨论数量: 8

快速入门《Laravel 9 中文文档》 9.x好像提供了这个功能,可以看看实现

1年前 评论
dengxit (作者) 1年前

同步场景下依然可以用事务包裹来到达目的,异步队列场景下数据库挂了会有异常队列任务可以重试。 再说如果生产环境下数据库都挂了,你还在关心这并没有什么影响的一点冗余数据吗

1年前 评论
wpcolor (楼主) 1年前
Y90 1年前
wpcolor (楼主) 1年前

MySQL的话,也可以用外键约束

1年前 评论
随波逐流

我在生产环境中, 已经弃用 observer了。

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!