Daten vor einer Commit-Transaktion abfragen

10

Meines Wissens nach können Sie in einem MS SQL Server Management Studio-Fenster nach dem Ausführen einer "Transaktion starten" und dem Vornehmen einiger Änderungen wie dem Hinzufügen von Daten zu einer Tabelle nur diese Tabelle und diese Änderungen aus demselben Fenster abfragen, bis Sie eine ausführen "Transaktion festschreiben".

Gibt es eine Möglichkeit, eine Abfrage von einer anderen Quelle durchzuführen, bevor die "Commit-Transaktion" ausgeführt wird?

Spezifisch für mein aktuelles Ziel und um einen Kontext hinzuzufügen. Ich mache einige SQL-Abfragen von Excel Power Query. Ich möchte diese Abfragen wirklich vor der "Commit-Transaktion" ausführen können, damit ich einige Analysen durchführen und herausfinden kann, ob ich anstelle eines Commits einen Rollback durchführen sollte.

Alex
quelle

Antworten:

14

Ja, es ist möglich, wenn Sie die Transaktionsisolationsstufe für die Sitzung ändern (das nennen Sie in SSMS "Fenster"), in der geänderte Daten abgefragt werden. Oft ist dies keine so gute Idee, da Sie möglicherweise unerwartete Ergebnisse erzielen . Betrachten Sie die Nebenwirkungen sorgfältig. Ich habe keine Ahnung, ob es möglich ist, die Transacion-Isolationsstufe in der Excel Power Query zu ändern.

Beispielsweise würden die folgenden Abfragen einige Daten einfügen und das Update auch ohne Commit / Rollback korrekt anzeigen.

-- Session 1
begin tran tx_test;
-- Assume the Test table exists and insert is okay
insert dbo.Test(datadate, content) values (getdate(), 'transaction');
select * from Test; -- Shows the new data
-- After select, one would execute one of the following
-- commit;
-- rollback;

Währenddessen führt die zweite Sitzung eine Auswahl aus, die nichts zu tun scheint:

-- Session 2
-- This waits for uncommitted transaction
-- and returns results after 1st session commits/rollbacks
select * from Test;

Erstellen Sie eine dritte Sitzung und ändern Sie deren Isolationsstufe:

-- Session 3
set transaction isolation level read uncommitted;
-- This reads the inserted data from the 1st session, even before commit
select * from Test;
vonPryz
quelle
Das alles macht Sinn! Ich muss es ausprobieren und werde es dann als Antwort markieren. Vielen Dank.
Alex
3

Aus Best Practices sollten Transaktionen so kurz wie möglich gehalten werden und niemals auf Benutzerinteraktion warten . Jedes Mal, wenn Sie eine Daten- oder Schemaänderung innerhalb einer Transaktion durchführen, werden die berührten / geänderten Objekte oder Zeilen gesperrt, wodurch die Abfragen anderer Benutzer warten. Dies kann wiederum Ketteneffekte erzeugen, die Ihren Datenbankserver zum Stillstand bringen können.

In dem von Ihnen beschriebenen Szenario würde ich Ihnen stattdessen empfehlen, eine Kopie der Daten zu erstellen, um "Was-wäre-wenn" -Tabellen zu trennen, in denen Sie Ihre Änderungen vornehmen und die Ergebnisse überprüfen können. Wenn Sie mit den Ergebnissen zufrieden sind, verwenden Sie eine Transaktion, um die Daten dieser Tabelle wieder mit den ursprünglichen Tabellen zusammenzuführen.

Daniel Hutmacher
quelle
Klingt nach einem guten Rat. @vonPryz 'Antwort war nur, dass ich im Moment brauchte. Ich denke, dass Ihr Vorschlag etwas sein sollte, das ich als nächstes betrachte.
Alex