Frage

Ich möchte bitte Eure Meinung in die Verwendung von MySQL-Trigger oder Transaktionen in einer website.

Tatsächlich habe ich eine Geschichte payment Tabelle mit - UserId | OperationId | Comment | Credits | Sign (debit or credit).Also jede Zahlung Betrieb ist eingefügt in diese Tabelle.

Allerdings wird es sehr zeitaufwändig sein, die Berechnung jedes mal, wenn der Gesamt-Betrag, den der Benutzer jedes mal, wenn er die Aktion.So dachte ich, ist vielleicht eine gute Idee, um den Gesamt-Betrag für jeden Benutzer in einem user profile Tabelle.

Hier ist das problem.Wie kann ich sicher sein, dass der gesamte Kreditbetrag form der profile Tabelle bleiben wird, synchronisiert mit den Operationen aus payment Geschichte Tabelle ?

Ich dachte, mit 2 Methoden:

  • MySQL-Trigger oder
  • Transaktionen codiert in den source-code

Welche ist zuverlässiger?Was, wenn ich große Datenbank (über 100.000 Benutzer) ?

Haben Sie irgendwelche Vorschläge, um dies zu tun?

BD MySQL-engine ist InnoDB.

War es hilfreich?

Lösung

Ohne Zweifel würde ich Auslöser ausschließen und streng bei Transaktionen bleiben.

Auslöser sind von Natur aus gespeicherte Verfahren. Ihre Aktionen sind praktisch schwer zurückzusetzen. Auch wenn alle zugrunde liegenden Tabellen innoDB sind, erfahren Sie ein proportionales Volumen von gemeinsamen Zeilenschlössern und nervigen Intermittenz aus exklusiven Zeilensperrungen. Dies wäre der Fall, wenn Trigger Tische mit manipulieren würden Einlegt und Updates, die stagniert werden, um einen Hochleistungs -MVCC in jedem Aufruf zu einem Auslöser durchzuführen.

Kombinieren Sie dies mit der Tatsache, dass Die richtigen Datenvalidierungsprotokolle werden in der gespeicherten Prozedursprache von MySQL nicht implementiert. Business Intelligence ist in Ordnung, um in einer Datenbank enthalten zu sein, vorausgesetzt, die gespeicherte Prozedursprache kann eine Transaktionsumgebung verarbeiten. Als MySQL DBA muss ich ehrlich sagen, dass dies bei MySQL nicht der Fall ist. Oracle (PL/SQL), PostgreSQL (PL/PGSQL) und SQL Server (T-SQL) haben diese Kante über MySQL.

In Bezug auf Transaktionen verfügt MySQL hat InnoDB als Hauptsäurestrainer-Motor (DEAFAFT-Speichermotor in MySQL 5.5). Es hat eine hervorragende Absturzwiederherstellung und folgt den Säure -Compliance -Protokollen.

Ich würde jedes Mal Transacitons über Trigger wählen.

Andere Tipps

Ich stimme Rolandos Einschätzung zu. Ihre Geschäftslogik sollte sich in Ihrer Anwendung befinden und Änderungen an der Datenbank transaktional vornehmen.

Die Skalierung auf 100.000 Benutzer hängt natürlich von Ihrer Anwendung und dem von ihnen generierten Datenbankverkehr ab. Mit MySQL unter einer schweren Transaktions -Schreibbelastung könnten Sie bald mit den Belastungen des Sharding und/oder der Replikation Ihres Datensatzes konfrontiert sein, um die akzeptable Anwendungsreaktion aufrechtzuerhalten.

Es gibt jedoch Alternativen zum Sharding von MySQL. Einer von ihnen ist Clustrix (mein Arbeitgeber), ein parallel skalierbares Hochleistungs-SQL-Datenbanksystem mit einem einzelnen Instanz. Es ist ein Cluster -Datenbanksystem, das sich als einzelner MySQL -Server darstellt. Skalierung der in diesem Thread beschriebenen Datenbank, die in einer einzigen Instanz von Clustrix nahtlos 100.000 Benutzern beschrieben wurde, müsste keine Sharding und keine zusätzliche Anwendungslogik erfordern.

Gute Antwort von Rolando.

Zusätzlich -- - Trigger sollte nicht verwendet werden für die Logik, denn ein paar von inter-Bezug Trigger später, werden die Dinge verwirrend schnell.Eine schöne Reihe von Anweisungen in einer gespeicherten Prozedur oder client-side-Verfahren können über die business-Logik deutlich mehr als ein paar verborgene Logik in der Datenbank.Es gibt auch Einschränkungen auf Trigger, mit Bezug auf die Tabelle, der Sie ausgelöst -- und so finden Sie sich selbst teilen Ihre Logik in zwei verschiedenen Orten..

Zusätzlich-Sie könnten finden Sie Möglichkeiten zur Optimierung an welchem Punkt diese Berechnungen geschehen in Ihrem business logic server, in der Erwägung, dass ein trigger ist gonna trigger-jedes mal.Sie finden sich ausschalten der trigger, die Tabelle zu aktualisieren, und dann re-Aktivierung der trigger -- was auch bedeutet, Sie müssen die trigger-Logik dass code.

Zusätzlich-Sie müssen nicht die ganze Logik in die business-Logik-Teil der code-Sie können erzwingen möchten die Tabelle Integrität durch die Verwendung von gespeicherten Prozeduren.Dies kann eine Transaktion zu starten, machen Ihre mehrere updates, und haben Dinge roll wieder schön, wenn etwas fehlschlägt.So jemand auf der Suche in der Datenbank kann die Logik zum einfügen einer Bestellung, zum Beispiel.Dies ist weniger wichtig, in der heutigen Welt, da web-services kann der single-access-Schnittstelle zu db;aber in dem Fall, wo mehrere ausführbare Dateien, haben Zugriff auf die DB, diese können gewaltig sein.

Zusätzlich-Sie sind gonna haben, Transaktionen sowieso-Sie sind nicht gonna führen Sie Ihre Trigger, ohne ein...Recht?So ist es gut zu wissen, wie Sie eine Transaktion starten;do some stuff;und dann Ende einer Transaktion.Wenn Sie sehen, dass dieses Muster in deinem code, noch ein Stück code, in dem es verwendet wird Licht auf die kognitive Belastung.Ein trigger, wenn Sie sich daran erinnern, dass es da ist, wird Sie zwingen, anders zu denken ... für diejenigen, die Transaktionen, die betroffen sind durch das auslösen, vor allem, wenn andere Tabellen gezogen werden, dass Sie auch können Trigger.

Grundsätzlich ist zwischen einer regelmäßig geplanten cron-job (oder ein Datenbank-agent-Auftrag) und gute gespeicherte Prozeduren, Sie können erreichen 99% von dem, was Sie wollen.Das 1 -%;überdenken Sie das Projekt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top