Or, even better:

  def runTxn[A](client: MongoClient)(txn: ClientSession => Observable[A]): Observable[A] = {
    for {
      session <- client.startSession()
      _ = session.startTransaction()
      res <- txn(session)
      _   <- session.commitTransaction()
      _ = session.close()
    } yield res
  }