nntp2http.com
Posting
Suche
Optionen
Hilfe & Kontakt

JDBC, PostgreSQL, und Transaktionen

Von: Markus P. (newsgroupsnospam@pithax.net) [Profil]
Datum: 23.06.2008 18:45
Message-ID: <af791$485fd338$54705512$26708@news.chello.at>
Newsgroup: de.comp.lang.java
Hallo,

laut
http://www.galileocomputing.de/openbook/javainsel7/javainsel_22_011.htm#mj419adceb593b6077
6295bd620d9e3b25
kann ich eine Transaktion so verwirklichen, wie oben beschrieben.
Bei PostgreSQL gibt es aber auch verschiedene Transaktionsmodi, zB
http://www.postgresql-support.de/pgbook/node135.html
Jetzt bin ich nicht sicher, wie ich eigentlich vorgehen soll, denn
Transaktion ist ja wohl nicht gleich Transaktion ist.
Soll mir das jetzt egal sein, oder kümmert sich JDBC darum, oder wie
kann ich vorgehen?
Ich habe ein Beispiel, wo ich so vorgehe.

public void setVeranstalter(VeranstalterTFO veranstalter) throws
DaoException {
con = DatabaseSingleton.getPoolConnection();
try {

con.setAutoCommit(false);
//			IDs anlegen
int a_id = -1, ek_id = -1;
//			Zuerst die Adressedaten einfügen
String conString = "INSERT INTO Adresse (a_strasse, a_hausnr,
a_bezirk, a_plz) " +
"VALUES (?,?,?,?)";
PreparedStatement pstmt = con.prepareStatement(conString);
pstmt.setString(1, veranstalter.getStrasse());
pstmt.setString(2, veranstalter.getHausnr());
pstmt.setString(3, veranstalter.getBezirk());
pstmt.setString(4, veranstalter.getPlz());
pstmt.execute();
//			Die ID bekommen...
conString = "SELECT A_id FROM Adresse WHERE a_strasse=? AND
a_hausnr=? AND a_bezirk=? AND a_plz=?";
pstmt = con.prepareStatement(conString);
pstmt.setString(1, veranstalter.getStrasse());
pstmt.setString(2, veranstalter.getHausnr());
pstmt.setString(3, veranstalter.getBezirk());
pstmt.setString(4, veranstalter.getPlz());
rs = pstmt.executeQuery();
while (rs.next())   {
a_id = rs.getInt(1);
}

//			Dann die Erreichbarkeit einfügen
conString = "INSERT INTO Erreichbarkeit (ek_telefon,ek_fax,ek_email) " +
"VALUES (?,?,?)";
pstmt = con.prepareStatement(conString);
pstmt.setString(1, veranstalter.getTelefon());
pstmt.setString(2, veranstalter.getFax());
pstmt.setString(3, veranstalter.getEmail());
pstmt.execute();
//		    Die EK_id bekommen
conString = "SELECT EK_id FROM Erreichbarkeit WHERE ek_telefon=? AND
ek_fax=? AND ek_email=?";
pstmt = con.prepareStatement(conString);
pstmt.setString(1, veranstalter.getTelefon());
pstmt.setString(2, veranstalter.getFax());
pstmt.setString(3, veranstalter.getEmail());
rs = pstmt.executeQuery();
while (rs.next())   {
ek_id = rs.getInt(1);
}

//			Erst jetzt darf der Veranstalter direkt eingefügt werden.
conString = "INSERT INTO Veranstalter
(V_kuerzel,V_name,V_A_id,V_EK_id) " +
"VALUES (?,?,?,?)";
pstmt = con.prepareStatement(conString);
pstmt.setString(1, veranstalter.getKuerzel());
pstmt.setString(2, veranstalter.getFirmenwortlaut());
pstmt.setInt(3, a_id);
pstmt.setInt(4, ek_id);
//			Die Transaktion, bestehend aus allen o.g. SQL-Befehlen hiermit
ausführen.
con.commit();
//			Den Standard wieder herstellen.
con.setAutoCommit(true);

} catch (SQLException e) {
try {
//				Im Fehlerfall die o.g. Transaktion wieder rückgängig machen.
con.rollback();
} catch (SQLException e1) {
throw new DaoException(e1);
}
DatabaseSingleton.closePoolConnection(con);
throw new DaoException(e);
} finally {
DatabaseSingleton.closePoolConnection(con);
}

}

Wäre das richtig so, oder kann ich auch ev. die "richtigen"
Transaktionen von PostgreSQL einbauen, oder muss ich das etwa gar nicht?

Danke im Voraus,
Markus

[ Auf dieses Posting antworten ]

Antworten