蒸气流数据库交易不是原子的

时间:2019-05-25 09:09:02

标签: swift vapor

我正在创建一个database事务,其中包含多个插入。结果将另存为Future的array。然后,我正在寻找do{..}.catch{..}构造中的运算结果。这是

  

问题:如果我从do块返回失败的将来,那么所有事务都会回滚-很好,但是如果我从“ catch”块返回相同的失败的将来,那么某些记录将提交到数据库。

>
    func save(on req: Request) -> Future<Confirmation>
    {
      return req.transaction(on: .psql) { conn in
      let promise = conn.eventLoop.newPromise(Confirmation.self)
      var futures = [Future<Bool>]()
       for i in 0 ..< 20 
       {
         let g1 = Group()
         g1.name = "\(i)"
         let f1 = g1.save(on: conn).then { _ -> Future<Bool> in
         if i == 15
         {
//          return conn.eventLoop.newSucceededFuture(result: false) //1
            return conn.eventLoop.newFailedFuture(error: SyncError.nullPrimaryKey) // 2
          } 
          else 
          {
            return conn.eventLoop.newSucceededFuture(result: true)
          }
        }
        futures.append(f1)
      }

      futures.do(on: conn){ results in
        var res = true
        results.forEach { e in
          res = res && e
        }
        if res {
          promise.succeed(result: Confirmation())
        } 
        else {
          promise.fail(error: SyncError.nullPrimaryKey) // 3
         }
        }.catch { e in
         promise.fail(error: e) // 4
     }
     return promise.futureResult
    }
  }
}

在此示例中,承诺在第4行中失败了(块 catch ),但我遇到了未还原交易的问题。 但是,如果我注释掉第1行并取消注释第2行,则在第3行中完成了 promise (承诺 do ),并且整个交易都已正确还原。

是我的错在代码中的某个地方,还是Fluent错误?

1 个答案:

答案 0 :(得分:1)

我不确定您的示例代码中的结构,尤其是SyncError.nullPrimaryKey中的if i == 15错误,但看起来像下面的代码一样

func save(_ req: Request) throws -> Future<Confirmation> {
    return req.transaction(on: .psql) { conn in
        return (0...15).map {
            Group(name: $0)
        }.map {
            $0.save(on: conn).transform(to: ())
        }.flatten(on: conn).transform(to: Confirmation())
    }
}

希望有帮助