Frage

Ich habe gelesen, dass einige Entwickler / DBAs mit Transaktionen in allen Datenbankaufrufe empfehlen, auch schreibgeschützt nennt. Während ich innerhalb einer Transaktion verstehen Einfügen / Aktualisieren, was innerhalb einer Transaktion der Nutzen des Lesens?

War es hilfreich?

Lösung

So haben Sie eine konsistente Sicht auf die Datenbank erhalten. Stellen Sie sich vor, Sie haben zwei Tabellen, die miteinander verknüpfen, aber aus irgendeinem Grund haben Sie 2 wählt ... in pseuodocode:

myRows = query(SELECT * FROM A)
moreRows = query(SELECT * FROM B WHERE a_id IN myRows[id])

Wenn zwischen den beiden Abfragen, jemand ändert B einige Zeilen zu löschen, Sie gehen ein Problem haben.

Andere Tipps

Ähnlich wie RoBorg sagte, Sie tun würde WÄHLT w / i Transaktionen das Lesen von Phantomdaten zwischen Aussagen zu verhindern. ABER ist es wichtig, dass die Standardtransaktionsisolationsstufe in SQL Server zu beachten ist verpflichtet, lesen, wird nur verhindert schmutzig liest; Phantomdaten zu verhindern, müssten Sie mindestens WIEDERHOLBARE READ verwenden. "Verwenden Sie diese Option nur bei Bedarf."

http://msdn.microsoft.com/en-us/library /ms173763.aspx

Ich habe, dass ‚Transaktionen‘ verhalten sich sehr unterschiedlich auf verschiedene SQL-Server gefunden. In einigen Fällen kann eine Transaktion gestartet sperrt alle anderen Verbindungen von der Möglichkeit, jede SQL auszuführen, bis die Transaktion festgeschrieben wird, oder zurück (MS SQL Server 6.5) gerollt. Andere haben keine Probleme, und nur sperren, wenn es eine Änderung (Oracle) ist. Die Schlösser können sogar erweitern, um nur die Änderungen zu umfassen -. Zellenschlösser / Zeilensperren / Seitensperren / Tabellensperren

Normalerweise verwende ich Transaktionen nur dann, wenn die Datenintegrität zwischen mehreren Einfügen / Löschen / Update-Anweisungen eingehalten werden muss. Sogar noch, ich ziehe dieses mit DB-definiert implementieren Cascading löscht, so dass die Datenbank automatisch tut und atomar.

eine Transaktion verwenden, wenn Sie eine Situation voraussehen können, wo Sie mehrere Änderungen rückgängig zu machen wollen würden, aber ansonsten wird die Datenbank tun, es ist Atom-Updates ohne den zusätzlichen Code mit ihm fertig zu werden.

Ich habe das schon von den oberen letzten paar Minuten, da es etwas, was ich mehr darüber wissen sollte. Hier ist, was ich gefunden habe.

Transaktionen würden um eine ausgewählte nützlich sein, wenn Sie diese Zeile sperren möchten, während eine Person Aufzeichnungen zu lesen und wollen es nicht zu geändert oder gelesen. Zum Beispiel dieser Abfragen ausgeführt werden:

(in Abfragefenster 1)

BEGIN TRAN SELECT * FROM MYTABLE MIT (ROWLOCK XLOCK) WHERE ID = 1

(in Abfragefenster 2)

SELECT * FROM MYTABLE WHERE ID = 1

(Abfragefenster 2 wird die Ergebnisse nicht zurück, bis Sie diese laufen im Fenster 1)

COMMIT TRAN

Nützliche Links:

http://msdn.microsoft.com/en-us/library /aa213039.aspx

http://msdn.microsoft.com/en-us/library /aa213026.aspx

http://msdn.microsoft.com/en-us/library /ms190345.aspx

Mein Ziel war es, etwas zu bekommen zu blockieren - und es funktionierte schließlich nach dem XLOCK dort hinzufügen. Einfach wurde mit ROWLOCK funktioniert nicht. Ich nehme an, es wurde eine gemeinsame Sperre Ausgabe (und die Daten gelesen hatte, wurde) .. aber ich bin immer noch diese zu erkunden.

Hinzufügen - MIT (UPDLOCK ROWLOCK) - lassen Sie auswählen und die Zeilen, um Updates zu sperren, die mit Parallelität helfen würde.

Seien Sie mit Tabellenhinweisen vorsichtig. Wenn Sie sie aufs Geratewohl starten Anwendung, um Ihr System zu einem Schleichen verlangsamen, wenn Sie auch eine kleine Anzahl von Benutzern auf Ihrer App erhalten. Das ist das einzige, was ich wusste, bevor sie in diese suchen;)

Ich würde sagen, dass eines der Hauptziele einer Transaktion ist Rollback-Potential zu bieten, wenn es irgendwelche Probleme-ist, die nicht mehr existierenden ist, wenn sie nur zu lesen.

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