Auto-Commit in SQL Server und Oracle

7

Als ich vor vielen Jahren an Oracle 8 gearbeitet habe, habe ich den Befehl COMMIT nach jedem Masseneinfügen manuell ausgeführt. In SQL Server ist Auto-Commit standardmäßig aktiviert, was sowohl Vorteile als auch Gefahren bietet.

Ich möchte wissen, ob in den neueren Versionen von Oracle Auto-Commit standardmäßig noch deaktiviert ist. Ich möchte auch wissen, wie das automatische Festschreiben in SQL Server 2005 deaktiviert wird.

RPK
quelle

Antworten:

7

Orakel

Von AskTom im Jahr 2000:

... die einzige Methode, mit der Oracle arbeitet, ist "Client sagt uns, wann wir ein Commit durchführen sollen". Wir haben keinen Autocommit-Modus. Verschiedene TOOLS und APIs tun dies (zB: Ich kann sqlplus anweisen, automatisch festzuschreiben, das bedeutet nur, dass sqlplus nach jeder Anweisung ein Commit ausgibt).

Dies ist immer noch wahr und wird es wahrscheinlich immer sein. Eine ausführliche Beschreibung finden commitSie in den Oracle-Dokumenten

SQL Server 2000+

von SO (invertiert):

Sie können das automatische Festschreiben deaktivieren, indem Sie implicit_transactions auf ON setzen

oder wenn Sie es vorziehen, aus den Dokumenten (oder Marks direkterem Link )

Jack sagt, versuchen Sie es mit topanswers.xyz
quelle
1
Nach dem versehentlichen Löschen von Zeilen in SQL Server sollte AUTO-COMMIT standardmäßig deaktiviert sein. Es ist gefährlich zu spielen, wenn es standardmäßig eingeschaltet ist.
RPK
1
Ich sage, geh mit der Standardeinstellung und sei vorsichtiger, sorry :)
Jack sagt, versuche topanswers.xyz
Wir sind standardmäßig nicht vorsichtig und daher gibt es eine Option zum Wiederherstellen.
RPK
Ich verstehe nicht, was du damit meinst, fürchte ich? Ich bin glücklich , zu chatten , wenn Sie mögen?
Jack sagt, versuchen Sie topanswers.xyz
1
Ich habe "Tom gefragt" :)
Jack sagt, versuchen Sie es mit topanswers.xyz
5

Für SQL Server würden Sie IMPLICIT_TRANSACTIONS ON setzen .

Im impliziten Transaktionsmodus startet jede DML ( SELECT, INSERT, DELETE, UPDATEetc) oder DDL ( CREATE, ALTER, DROPetc) eine Transaktion und Sie müssen explizit COMMIToder ROLLBACK.

Alternativ kann eine explizite Transaktion mit gestartet werden BEGIN TRANSACTION.

Mark Storey-Smith
quelle
4

Wie oben beantwortet, können Sie in SQL implizite Transaktionen für Ihre Verbindung mit dieser SET IMPLICIT_TRANSACTIONS ONEinstellung aktivieren und die von Mark und Jack bereitgestellten Links verwenden.

Ich würde davor warnen, dies auf der ganzen Linie zu tun und es sogar oft in Ihren eigenen Verbindungen zu tun. Die Kehrseite dieser Änderung ist, dass Sie jetzt eine Transaktion für alle Ihre Aktionen haben. Wenn Sie nach sich selbst nicht richtig verwalten oder bereinigen, können jetzt offene Transaktionen die DML in Ihrem System blockieren.

Wenn Sie befürchten, dass bei der manuellen Bereinigung versehentlich die falschen Zeilen gelöscht / aktualisiert werden, gibt es einige bessere Optionen:

  1. Machen Sie zuerst ein Backup
  2. Sichern Sie die Tabelle zuerst, indem Sie alle Zeilen in einer neuen Tabelle auswählen (Wählen Sie * in tmpInCaseIMessUp_TableName_mw FROM TableName aus).
  3. Gewöhnen Sie sich an, BEGIN TRANSACTIONvor dem Schreiben eines Updates / Einfügens / Löschens aus einem System zu tippen ...

Manchmal starte ich eine Sitzung und tippe

BEGIN TRAN

-- COMMIT TRAN 

(auskommentiert, damit es nicht passiert, aber tippe es, damit ich nicht beschäftigt werde und vergesse)

Dann mache ich meine Arbeit nach dem Beginn der Übertragung, schreibe in derselben Sitzung eine Select-Anweisung, die das Nachbild zeigt, um sicherzustellen, dass ich nichts falsch gemacht habe (oder verlasse mich nur auf die Anzahl der betroffenen Zeilen usw.) und dann verpflichten, wenn alles gut aussieht.

Mike Walsh
quelle
"Wenn Sie nach sich selbst nicht richtig verwalten oder bereinigen, können Sie jetzt offene Transaktionen haben, die DML in Ihrem System blockieren." nicht unbedingt wahr. Wenn eine implicit_transactions-Verbindung beendet wird, wird jede offene Transaktion automatisch zurückgesetzt.
Mark Storey-Smith
"Wenn eine implicit_transactions-Verbindung beendet wird, wird jede offene Transaktion automatisch zurückgesetzt." Das ist Aufräumen ;-) Öffnen Sie ein zweites Fenster in SSMS, beschäftigen Sie sich dort, beantworten Sie einige E-Mails und tätigen Sie einen Anruf ... Das ist kein Aufräumen.
Mike Walsh
Ich denke an Anwendungscode, Sie denken an SSMS. Ich habe die Gewohnheit, TRAN in jedem SSMS-Fenster zu beginnen, wie Sie vorgeschlagen haben, genau aus den von Ihnen genannten Gründen.
Mark Storey-Smith
Ich denke, dass die Einstellung bei Anwendungsverbindungen noch schlechter sein kann. Haben Sie das Code- und Transaktionsmanagement in den meisten Anwendungen gesehen? Vielleicht werde ich nur angerufen, wenn die Dinge schlecht sind und ich das Gute nicht sehe, aber ich sehe viele Leute, die Transaktionen mit expliziten Transaktionen nicht gut genug verwalten. Implizite Transaktionen werden das zweifellos in mehr Fällen schlimmer machen als nicht mit diesen Apps, die ich Ich denke an. Ich hatte angenommen, dass sich das OP auf SSMS bezieht, das Änderungen vorgenommen hat.
Mike Walsh
1
In Bezug auf # 3 verfügt SSMS Tools Pack über eine neue Abfragevorlagenfunktion , die standardmäßig auf eingestellt ist BEGIN TRAN ... ROLLBACK.
Nick Chammas
4

Nun ... Es ist nicht unbedingt richtig, dass Oracle keinen Autocommit-Modus hat. Wenn Sie sich die zugrunde liegende OCI ansehen, sehen Sie, dass es ein OCI_COMMIT_ON_SUCCESSFlag gibt, an das Sie übergeben können OCIStmtExecute(). Wieso würdest du das machen? Wenn Sie das sehr verbreitete Muster INSERT → COMMIT → INSERT → ... verwenden (z. B. beim Protokollieren von Zeitreihendaten), halbiert dies die Anzahl der erforderlichen Netzwerk-Roundtrips. Dies kann eine erhebliche Leistungsverbesserung darstellen um dieses Flag zu verwenden, insbesondere über WAN-Verbindungen.

Wenn Sie OCI_DEFAULTals Flag übergeben, ist die automatische Festschreibung deaktiviert. Dies ist also das Standardverhalten.

Gaius
quelle
3

In SQL Server (getestet mit SQL2005) können Sie zum Festlegen der automatischen Festschreibung auf Serverebene die TSQL verwenden, wie oben von anderen erläutert, oder Sie können die SSMS-GUI verwenden. So verwenden Sie SSMS:

  1. Öffnen Sie SSMS und stellen Sie eine Verbindung zu Ihrem SQL Server her.
  2. Klicken Sie in der Menüleiste auf Extras> Optionen.
  3. Erweitern Sie im Optionsfenster 'Query Execution'> 'SQL Server'.
  4. Klicken Sie auf "ANSI".
  5. Aktivieren Sie \ Deaktivieren Sie das Kontrollkästchen 'SET IMPLICIT_TRANSACTIONS'.

Wenn das Kontrollkästchen deaktiviert ist, bedeutet dies, dass die automatische Festschreibung aktiviert ist. Wenn das Kontrollkästchen aktiviert ist, ist das automatische Festschreiben deaktiviert.

Stanley Johns
quelle