Przejdź do treści

Transakcje#

Transakcje pozwalają upewnić się, że wiele operacji zakończy się powodzeniem, zanim dane zostaną zapisane w bazie danych. Po rozpoczęciu transakcji możesz normalnie wykonywać zapytania Fluent. Jednak żadne dane nie zostaną zapisane w bazie danych, dopóki transakcja się nie zakończy. Jeśli w dowolnym momencie transakcji zostanie zgłoszony błąd (przez Ciebie lub przez bazę danych), żadna ze zmian nie zostanie zastosowana.

Aby wykonać transakcję, potrzebujesz dostępu do czegoś, co może połączyć się z bazą danych. Zazwyczaj jest to przychodzące żądanie HTTP. W tym celu użyj req.db.transaction(_ :):

req.db.transaction { database in
    // use database
}

Wewnątrz domknięcia transakcji musisz używać bazy danych dostarczonej w parametrze domknięcia (nazwanej database w powyższym przykładzie) do wykonywania zapytań.

Gdy to domknięcie zwróci wynik pomyślnie, transakcja zostanie zatwierdzona.

var sun: Star = ...
var sirius: Star = ...

return req.db.transaction { database in
    return sun.save(on: database).flatMap { _ in
        return sirius.save(on: database)
    }
}

Powyższy przykład zapisze sun, a następnie sirius, zanim transakcja zostanie zakończona. Jeśli zapis którejkolwiek z gwiazd się nie powiedzie, żadna z nich nie zostanie zapisana.

Po zakończeniu transakcji jej wynik można przekształcić w inny future, na przykład w status HTTP wskazujący na zakończenie, jak pokazano poniżej:

return req.db.transaction { database in
    // use database and perform transaction
}.transform(to: HTTPStatus.ok)

async/await#

Jeśli używasz async/await, możesz przekształcić kod w następujący sposób:

try await req.db.transaction { transaction in
    try await sun.save(on: transaction)
    try await sirius.save(on: transaction)
}
return .ok
Edytuj tę stronę