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

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《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年前 评论