Ich habe eine Frage zu MySQL und Transaktionen. Ich arbeite mit MySQL 5.7.18, Python 3 und der Oracle MySQL Connector v2.1.4Was ist der Unterschied (in MySQL) zwischen Transaktions-Rollback und nicht Commit?
Ich verstehe nicht den Unterschied zwischen a) eine Transaktion und -Bei Fehler aufweist - und Rollback b) nicht mit Transaktion und - im Fehlerfall - einfach die Änderungen nicht übernehmen.
Beide scheinen mich mit genau den gleichen Ergebnissen verlassen (d. H. Keine Einträge in der Tabelle, siehe Codebeispiel unten). Hat das mit der Verwendung von InnoDB zu tun - würden sich die Ergebnisse sonst unterscheiden?
Was ist der Vorteil der Verwendung einer Transaktion ist, wenn 1) I nicht begangene Änderungen Rollback und 2) ich auch nur die Änderungen konnten nicht begehen (bis ich mit meiner Aufgabe oder sicher fertig bin, dass einige Abfrage nicht erhöhen irgendwelche Ausnahmen)?
Ich habe versucht, die Antworten auf diese Fragen in https://downloads.mysql.com/docs/connector-python-en.a4.pdf zu finden, konnte aber den wesentlichen Unterschied nicht finden.
Jemand fragte eine fast identische Frage und erhielt einige Antworten, aber ich glaube nicht, dass diese tatsächlich eine Antwort enthalten: Mysql transaction : commit and rollback Antworten auf mehrere Verbindungen offen und Sichtbarkeit von Änderungen. Ist das alles da?
import mysql.connector
# Connect to MySQL-Server
conn = mysql.connector.connect(user='test', password='blub',
host='127.0.0.1', db='my_test')
cursor = conn.cursor(buffered=True)
# This is anyway the default in mysql.connector
# cursor.autocommit = False
sql = """CREATE TABLE IF NOT EXISTS `my_test`.`employees` (
`emp_no` int(11) NOT NULL AUTO_INCREMENT,
`first_name` varchar(14) NOT NULL,
PRIMARY KEY (`emp_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8"""
try:
cursor.execute(sql)
conn.commit()
except:
print("error")
# Arguments on default values
# conn.start_transaction(consistent_snapshot=False,
# isolation_level=None, readonly=False)
sql = """INSERT INTO `my_test`.`employees`
(`first_name`)
VALUES
(%s);"""
employees = {}
employees["1"] = ["Peter"]
employees["2"] = ["Bruce"]
for employee, value in employees.items():
cursor.execute(sql, (value[0],))
print(conn.in_transaction)
# If I do not commit the changes, table is left empty (whether I write
# start_transaction or not)
# If I rollback the changes (without commit first), table is left empty
# (whether I write start_transaction or not)
# If I commit and then rollback, the rollback had no effect (i.e. there are
# values in the table (whether I write start_transaction or not)
conn.commit()
conn.rollback()
Vielen Dank für Ihre Hilfe im Voraus! Ich schätze es.
Vielen Dank für Ihre Antwort. Ich denke aber, ich muss widersprechen - und das ist genau Teil meiner Verwirrung. Eine Transaktion sollte Anweisungen in etwas Unteilbares "bündeln". Also, wenn ich 3 sequentielle Anweisungen (z. B. INSERT INTO) ausführen muss und die zweite fehlschlägt, will ich keine Änderungen in meiner Tabelle/DB (** alles oder nichts **). ** ABER **: Dies ist genau was passiert, wenn ich nur die drei Anweisungen ausführen, ohne sie eine Transaktion zu deklarieren und nur Commit, wenn alle drei erfolgreich abgeschlossen wurden. –
Siehe den obigen Code. Es gibt zwei Datenänderungsanweisungen (cursor.execute). Beide werden genau dann angewendet, wenn ich mich verpflichte. Ob ich explizit schreibe start_transaction oder nicht. Wenn ich nach Ausnahmen/Fehlern suche und die zweite -Anweisung eine Ausnahme auslöst, könnte ich einfach von der Festschreibung absehen. Es würden keine Daten in die Tabelle geschrieben. Obwohl ich die Anweisungen (explizit?) Nicht als Transaktion bündeln würde, sind sie "ziemlich" atomar. Vielleicht kommt meine Verwirrung von Autocommit wird standardmäßig in MySQL aber _off_ standardmäßig in mysql.connector für Python. –
Ahhh - gutes Feedback - Ich frage mich, ob das ist! Bitte aktualisieren Sie mit einem Kommentar, sobald Sie es herausfinden. Im Hinblick auf die Bündelung - Transaktionen sind gute Praxis, weil es explizit ist und nicht von anderen Variablen (wie Standardeinstellungen, Anzahl der Anweisungen, etc.) abhängig ist - und obwohl es in diesem einfachen Beispiel keine Rolle spielt, könnte es komplexer werden Szenarien! –