TypeScript - Vermeidung von Race Conditions in TypeORM
Ich arbeite an einer Codebasis, die TypeORM verwendet, und wir haben eine Tabelle, in der wir die Kontostandsinformationen eines Benutzers speichern.
So sieht unser Code ungefähr aus:
async updateAccountInfo(account: Account, tx: Transaction) {
if (tx.type == 'credit') {
account.balance = account.balance + amount
}
else if (tx.type == 'debit') {
account.balance = account.balance - amount
}
await this.accountRepo.save(account)
}
Das Problem ist, dass wir anfangen, Race-Conditions zu bekommen, wenn Transaktionen gleichzeitig eingehen, und wir am Ende den falschen Kontostand erhalten (es gibt noch vieles mehr, was der Code macht, wie zum Beispiel das Aktualisieren des Hauptbuchs usw., aber ich kann es hier nicht posten und halte es für nicht relevant für die Frage).
Ist es möglich, dies so umzuschreiben, dass ich stattdessen die Datenbank (MySQL) nutzen kann, um die Berechnung durchzuführen, sodass ich hoffentlich die Race Condition vermeiden kann, aber auch ohne den Query Builder verwenden zu müssen.
d.h. bei Sequelize könnten Sie möglicherweise so etwas machen wie
account.udpate({
balance: Sequelize.literal(`balance + ${amount}`),
where: { id: account.id }
})
Bei typeORM bin ich mir jedoch nicht sicher, wie man das macht, und ich konnte in der Dokumentation nichts darüber finden. Jede Hilfe wäre großartig.