Frage zu ResultSet

  • Themenstarter Themenstarter jUser15061989
  • Beginndatum Beginndatum
J

jUser15061989

Gast
Hallo!

Folgende Frage zum folgenden Code:

Java:
Statement stmt;
ResultSet rs;

stmt.execute("select pnr, pname, alter from person");

rs = stmt.getResultSet();
rs.last();
System.out.println(rs.getRow());

rs.moveToInsertRow();
rs.updateObject(1, 10);
rs.insertRow();

rs.last();
System.out.println(rs.getRow());

Bei beiden Ausgaben erhalte ich das gleiche Ergebnis. D.h. wenn z.B. zuvor 9 Zeilen in der Tabelle vorhanden sind, wird auch nach
Code:
rs.insertRow();
die Zahl 9 ausgegeben.

In der Datenbank wurde die Zeile jedoch korrekt eingefügt.
Gibt es eine Möglichkeit, dass durch obigen Code auch im ResultSet die Anzahl der Zeilen um 1 erhöht wird?
 
Nein, das wird nicht so einfach gehen.

Und der Grund ist der sogenannte Isolation-Level der JDBC-Verbindung zur Datenbank.

Das bedeutet, dass Du angegeben kannst wieviel Parallelität Du zulassen kannst (Concurrency) und wieviel Performance Du möchtest. Dies sind oft zwei Dinge, die teilweise gegeneinander arbeiten. Häufig wird der Default Isolation Level TRANSACTION_REPEATABLE_READ benutzt. Dieses bedeutet, dass ein Client (dein Programm) nur bereits committede Daten sehen kann. Dies ist bei deinem Test der Fall, da Du in einer Transaktion die Datengrundlage änderst, indem Du Daten einfügst. Diese sind aber noch nicht committed und daher noch nicht im bereits offenen ResultSet sichtbar. Machst Du den Select noch einmal, sollte die Zeile im ResultSet sichtbar sein, da ich auch nicht sehe, dass Du Dich besonders um Transaktionsgrenzen kümmerst.

Wie Du aus den Anmerkungen merkst ist dieses Thema Transaktionen bei DB sehr wichtig und ein Ändern des Verhaltens solltest Du nur machen, wenn Du genau weisst, was Du damit "anrichtest"
 
[OT]
Java:
stmt.execute("select pnr, pname, alter from person");
Nur so interessehalber, mit welchem DBMS hast Du es hingekriegt, eine Tabelle zu erstellen, die eine Spalte namens "alter" hat?
[/OT]
 

Neue Themen


Zurück
Oben