Frage

Es scheint sehr unterschiedliche Meinungen zu Transaktionen über die Verwendung von für die aus einer Datenbank zu lesen.

Zitat aus dem Artikel Developer Transaktionsstrategien: Models und Strategien Überblick :

  

Warum würden Sie brauchen, um eine Transaktion, wenn   Sie lesen nur Daten? Die Antwort   ist, dass Sie dies nicht tun. Starten eines   Transaktion eine Nur-Lese-ausführen   Betrieb fügt den Aufwand für die   Verarbeitungs-Thread und kann dazu führen, geteilt   Lesesperren auf der Datenbank (je   auf welche Art von Datenbank, die Sie verwenden   und was die Isolationsstufe eingestellt   zu).

Als entgegengesetzte Meinung gibt es das folgende Zitat aus Hibernate Dokumentation Nicht-Transaktionsdatenzugriff und die Auto-commit Modus

  

Unsere Empfehlung ist es, nicht die Verwendung   Autocommitmodus in einer Anwendung, und   Nur-Lese-Transaktionen gelten nur   wenn es eine offensichtliche Leistung   profitieren oder wenn zukünftige Code-Änderungen   höchst unwahrscheinlich ist. immer lieber   regelmäßige ACID-Transaktionen zu einer Gruppe   Ihre Datenzugriffsoperationen,   unabhängig davon, ob Sie lesen oder   Schreiben von Daten.

Es gibt auch eine ähnliche Debatte über die Eclipsemailingliste hier .

Also, wo liegt die Wahrheit? Sind Transaktionen zum Lesen von Best-Practice oder nicht? Wenn beide sind tragfähige Lösungen, welche die Kriterien für die Transaktionen mit?

Soweit ich es nur einen Unterschied machen, sehen kann, wenn die Isolationsstufe höher ist als ‚read committed‘. Ist das richtig?

Was sind die Erfahrungen und Empfehlungen?

War es hilfreich?

Lösung

Steven Devijver lieferte einige gute Gründe für Transaktionen, auch wenn die Operationen beginnen werden nur die Datenbank lesen:

  • Set-Timeouts oder Sperrmodi
  • Stellen Sie die Isolationsstufe

Standard SQL erfordert, dass auch eine Abfrage eine neue Transaktion beginnen muss, wenn es keine Transaktion läuft derzeit. Es gibt DBMS, wo das ist nicht das, was passiert - die mit einem Autocommitmodus, zum Beispiel (die Anweisung eine Transaktion startet und verpflichtet sie sofort die Anweisung abgeschlossen ist). Andere DBMS machen Aussagen Atom (effektiv Autocommit) standardmäßig, aber eine explizite Transaktion mit einer Angabe wie ‚BEGIN WORK‘ beginnen, autocommit Cancelling bis zum nächsten COMMIT oder ROLLBACK (IBM Informix Dynamic Server ist eine solche - wenn die Datenbank nicht MODE ANSI).

Ich bin mir nicht sicher über die Beratung nie rückgängig zu machen. Es macht keinen Unterschied zu der Nur-Lese-Transaktion, und soweit es Ihre DBAs ärgert, dann ist es besser, ROLLBACK zu vermeiden. Aber wenn Ihr Programm beendet, ohne ein COMMIT zu tun, das DBMS sollte eine ROLLBACK auf unvollständige Transaktion tun - sicher, wenn es die Datenbank geändert, und (der Einfachheit halber), auch wenn Sie nur Daten ausgewählt

.

Insgesamt, wenn Sie das Standardverhalten von einer Reihe von Operationen ändern möchten, verwenden Sie eine Transaktion, auch wenn die Transaktion schreibgeschützt ist. Wenn Sie zufrieden mit dem Standardverhalten sind, dann ist es nicht entscheidend, um eine Transaktion zu verwenden. Wenn Ihr Code zwischen DBMS sein tragbar ist, ist es am besten davon ausgehen, dass Sie eine Transaktion benötigen.

Andere Tipps

Zunächst einmal, das klingt wie eine vorzeitige Optimierung. Als Steven wies darauf hin, die meisten vernünftigen Datenbanken werden Sie in einer Transaktion ohnehin setzen, und alles, was sie wirklich nach jeder Anweisung begehen tun ruft. Aus dieser Perspektive könnte autocommit weniger performant, da jede Anweisung eine neue Transaktion gestartet hat. Oder vielleicht nicht. Es wird sich zeigen Benchmarking und ich wette, es nicht zu lecken Unterschied zu Ihrer Anwendung macht.

Ein Grund, warum Sie wollen immer eine Transaktion verwenden, ist die Konsistenz des Schutzes. Wenn Sie mit manuell deklariert eine Transaktion Hantieren starten nur, wenn Sie „müssen“, dann dann wirst du in einer kritischen Zeit vergessen. Oder dass angeblich nur schreib Satz von Operationen plötzlich nicht ist, sei es, weil ein späterer Programmierer nicht erkennen, dass es sein sollte oder weil Ihr Code ruft eine Funktion, die eine versteckte Schreib hat. Zum Beispiel, ich meine eigene Befehlszeile Datenbank-Clients Autocommit nicht. Das bedeutet, ich kann Fett Finger eine Lösch-Abfrage und noch ein Rollback.

Es gibt die Isolationsstufe, wie aufgezeigt. Auf diese Weise können Sie mehrere liest tun, ohne sich Sorgen, wenn ein anderer Prozess in Ihre Daten geschrieben hat zwischen ihnen Ihre liest effektiv Atom machen. Dadurch werden Sie von vielen Stunde Debuggen einer Race-Bedingung speichern.

Und schließlich kann man oft eine Transaktion festgelegt schreibgeschützt werden. Diese prüfen Ihre Annahme und Fehler aus, wenn etwas zu schreiben versucht.

Hier ist ein schöner Artikel alles bis Summieren . die Details sind Oracle spezifisch, aber die Konzepte sind generisch.

Transaktion werden für Nur-Lese-Operationen erforderlich, wenn Sie einen bestimmten Timeout für Abfragen andere als die Standard-Timeout einstellen möchten, oder wenn Sie wollen die Isolationsstufe ändern.

Auch jede Datenbank - nicht wissen, über Ausnahmen - wird intern eine Transaktion für jede Abfrage starten. Es ist allgemein nicht getan betrachtet Transaktionen rückgängig zu machen, wenn das Rollback nicht erforderlich ist.

DBA Überwachung Rollback-Aktivität sein kann, und jedes Standard-Rollback-Verhalten wird sie in diesem Fall verärgern.

So werden Transaktionen verwendet sowieso, ob Sie sie oder nicht starten. Wenn Sie sie nicht brauchen sie nicht starten, aber nie einen Rollback auf Nur-Lese-Operationen durchführen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top