Clean Architecture - 如何处理数据库事务?
Clean Architecture - how to address database transactions?
在'clean architecture'中,交互者(用例)负责定义业务逻辑。大多数示例以这种方式定义用例:
public MyUseCase() {
public boolean execute(...) {
int id = repository.insert(a)
if(id > 0) {
b.aId= id;
repository.insert(b);
...
}
}
}
Interactors 主要使用简单的 CRUD,例如对存储库的操作或查询。
为简单起见,上面的示例是同步的,但您可以使用回调或 rxjava 等异步解决方案以相同的方法找到 repos。
但是用例完整性呢?例如,您不能 100% 确定在插入 a
之后它在您插入 b
时仍然存在。
如果在插入 a
后你在插入 b
.
时得到一些 RepositoryException 怎么办?
到目前为止我看到的所有回购协议都没有考虑到它,所以我的问题是:
clean architecture中上述问题的解决方案是什么?
这个答案可能有点晚了,但我一直在努力解决同样的问题并得出结论,事务管理实际上是用例的一部分 - 就像 "If something goes wrong with B, revert A's state"。因此,它可以而且应该在您的用例中明确说明,可能使用某种 "DataManagerRepo",如下所示:
public MyUseCase() {
public boolean execute(...) {
dataManagerRepository.openTransaction()
try {
int id = repository.insert(a)
if(id > 0) {
b.aId= id;
repository.insert(b);
...
}
catch (MyException exc) {
dataManagerRepository.rollbackTransaction()
}
dataManagerRepository.commitTransaction()
}
}
抽象完整性机制的名称可能有所不同,但思想是相同的。我希望这会对某人有所帮助。
在'clean architecture'中,交互者(用例)负责定义业务逻辑。大多数示例以这种方式定义用例:
public MyUseCase() {
public boolean execute(...) {
int id = repository.insert(a)
if(id > 0) {
b.aId= id;
repository.insert(b);
...
}
}
}
Interactors 主要使用简单的 CRUD,例如对存储库的操作或查询。 为简单起见,上面的示例是同步的,但您可以使用回调或 rxjava 等异步解决方案以相同的方法找到 repos。
但是用例完整性呢?例如,您不能 100% 确定在插入 a
之后它在您插入 b
时仍然存在。
如果在插入 a
后你在插入 b
.
到目前为止我看到的所有回购协议都没有考虑到它,所以我的问题是:
clean architecture中上述问题的解决方案是什么?
这个答案可能有点晚了,但我一直在努力解决同样的问题并得出结论,事务管理实际上是用例的一部分 - 就像 "If something goes wrong with B, revert A's state"。因此,它可以而且应该在您的用例中明确说明,可能使用某种 "DataManagerRepo",如下所示:
public MyUseCase() {
public boolean execute(...) {
dataManagerRepository.openTransaction()
try {
int id = repository.insert(a)
if(id > 0) {
b.aId= id;
repository.insert(b);
...
}
catch (MyException exc) {
dataManagerRepository.rollbackTransaction()
}
dataManagerRepository.commitTransaction()
}
}
抽象完整性机制的名称可能有所不同,但思想是相同的。我希望这会对某人有所帮助。