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 {
// 删除用户
// 删除文章
}

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案

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

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

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

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

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

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

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

3年前 评论
随波逐流

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

3年前 评论

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