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 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

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

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

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

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

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

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

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

2年前 评论
随波逐流

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

2年前 评论

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