簡體   English   中英

清潔架構 - 如何解決數據庫事務?

[英]Clean Architecture - how to address database transactions?

在“干凈架構”中,交互者(用例)負責定義業務邏輯。 大多數示例以這種方式定義用例:

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 如果在插入之后插入b會得到一些RepositoryException, a怎么辦?

我到目前為止看到的所有回購都沒有考慮到,所以我的問題是:

清潔架構中上述問題的解決方案是什么?

這個答案可能有點晚了,但我一直在努力解決同樣的問題,並得出結論,事務管理實際上是用例的一部分 - 比如,“如果B出現問題,還原A的狀態”。 因此,它可以而且應該在您的UseCase中明確說明,可能使用某種“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()
    }
}

名稱可能會有所不同,以抽象出完整性機制,但這個想法是一樣的。 我希望這會對某人有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM