这里事务指的是一般的数据库事务,而不是分布式事务。听起来很简单,但是即便如此,想实现的优雅一点也不是一件容易的事情。
假设有一个 QA 系统,当用户在上面提问的时候,系统保存问题,然后更新用户的提问数,最后触发一个问题已经被创建的异步事件来解耦逻辑(代码均使用 Lumen 框架):
1<?php
2
3try {
4 DB::beginTransaction();
5
6 $question->content = '...';
7 $question->save();
8
9 $user->questions_count += 1;
10 $user->save();
11
12 DB::commit();
13
14 event(new QuestionCreatedEvent($question));
15} catch (Exception $e) {
16 DB::rollBack();
17}
18
19?>
随着业务逻辑越来越复杂,会出现很多问题;
其一:事务处理相关代码的割裂感会越来越严重;
其二:事务处理相关逻辑会重复散落在很多地方,很容易遗漏或错乱。
如何解决问题?轻量级的方案,从 PSR-15 中可以找到答案,其中的 Middleware 机制构造出了一个类似洋葱皮的结构,