Frage zu Transaktionen mit Java/JDBC
-
Hallo,
eine Frage zu Transaktionen bei Java/JDBC. Unter der Annahme, dass autocommit=false ist. Ich erstelle auf der gleichen Connection 2 Prepared Statements und führe dann folgendes Beispiel aus.
preparedStatement1.executeQuery(); #1 preparedStatement2.executeQuery(); #2 connection.commit(); #3
Meine Frage ist im Grunde wann welche Tabellen gesperrt werden. Werden von #1 an alle Tabellen, welche für #1 und #2 benötigt werden bis #3 gesperrt? Wenn nicht, wie mache ich das?
-
Ich bin mir jetzt nicht ganz sicher, aber ich denke, das ist datenbankspezifisch. Es gibt verschiedene Lock Level. Oracle kann z.B. Row Level Locks, die würden dann nicht die ganze Tabelle, sondern nur die betroffenen Zeilen sperren. Aber da wird die Datenbank wohl erstmal selber entscheiden, was sie tun will, vielleicht auch über irgendwelche Einstellungen (globale Einstellungen oder Session Einstellungen). Das kann man sicher alles überschreiben, aber die genauen Befehle sind datenbankabhängig.
-
Naja, es gibt schon Standard Isolation Levels.
Die Frage ist nur wie genau es die einzelnen Datenbanken mit dem Standard nehmen. Bzw. welche Levels sie überhaupt anbieten/umsetzen.Das was Oracle "serializable" nennt ist soweit ich weiss z.B. in Wirklichkeit "snapshot isolation". Und entspricht eben nicht dem "serializable" wie es vom SQL Standard definiert wird.
Und auf Row-Locks kann man sich sinnvollerweise auch nicht verlassen. MSSQL kann z.B. auch Row-Locks. Aber er macht halt auch Lock-Escalation (Row -> Page -> Table) wenn er es für sinnvoll hält.
-
Hallo,
Danke für die Antworten. Die Transaction Isolation Level waren genau das was ich gesucht habe.
-
Du musst aber aufpassen. Die Isolation Levels geben dir nur Garantien dafür, dass bestimmte Dinge nicht auftreten. Sie geben keine Garantie darüber, welche Tabelle/Datensätze mit einem Lock versehen werden. Wie die Datenbank die Garantien sicherstellt, ist ihre Sache.
-
Danke für den Hinweis, aber dessen bin ich mir bewusst. Das schöne an Isolation level ist ja gerade, dass ich mich um das manuelle Locken nicht kümmern muss. Das hatte mich zuerst etwas verwundert. Von der "normalen" Programmierung ist man ja anderes gewohnt.