Auf der Suche nach einem Best-Practice-Tipp:Wählen Sie Sperren in Rails mit MySQL
Angenommen, ich habe ein Konto-Objekt mit Limit-Attribut. Jeden Tag können n Zahlungen mit der Summe ihrer Beträge bis zum Konto-Limit sein. Beim Erstellen einer neuen Zahlung wird überprüft, ob der Betrag und die Beträge anderer Zahlungen des Tages immer noch innerhalb des Kontolimits liegen, und entweder wird der Datensatz gespeichert oder es wird ein Fehler angezeigt. Jetzt
, nehmen wir an, ich habe Konto mit Limit $ 100, und gleichzeitig zwei Zahlungen von $ 99 erstellt werden. Jeder würde eine Auswahl treffen, sehen, dass nichts da ist, und fortfahren, sich selbst zu speichern, was dazu führt, dass insgesamt 198 $ gespeichert werden.
Was würden Sie dagegen tun? Ich habe darüber nachgedacht, zu Beginn der Transaktion eine Schreibsperre auf die Zahlungstabelle zu setzen, aber das scheint ziemlich umständlich, da ich nur wirklich darauf bedacht bin, Zahlungen, die zu einem bestimmten Konto gehören, nicht von anderen Transaktionen lesen zu lassen. Gibt es andere Möglichkeiten, diese Situation besser zu bewältigen?
„, sobald Sie die Informationen aus der Tabelle gelesen , alle Versuche, diese Datensätze zu aktualisieren oder zu lesen, müssen auf diese Transaktion warten. "- Was ist, wenn die Auswahl keine Datensätze enthält? oder im Fall des Fragestellers fragt er nach dem Gesamtwert existierender Datensätze, bevor er neue hinzufügt. wie weiß mysql was zu sperren? –