Hallo liebe Leute,
ich habe folgendes Problem. ich möchte mittels Stored procedures einige SQL-Befehle gegen meine Datenbank absetzen. Dazu habe ich zunächst in Java eine Methode definiert, die ein stored procedure anlegt. Die gesamte Anwendung läuft 10 Minuten lang und ich möchte sowohl erfolgreiche Transaktionen als auch Rollbacks zählen. Das mit den Transaktionen funktioniert wunderbar, jedoch steht bei rollbacks immer 0. Ich vermute einen Fehler in Postgres, bin mir aber nicht so ganz sicher. Hier mal die relevanten Methoden:
Methode zum Erstellen des stored procedure:
Methode zum "callen" des stored procedure:
Erste Frage: Habe ich grundsätzlich in java alles richtig gemacht um rollbacks aufzufangen? (Rollback vor commit?)
Zweite Frage: Muss ich bei dem stored procedure noch irgendwas mit rollback einfügen?
ich habe folgendes Problem. ich möchte mittels Stored procedures einige SQL-Befehle gegen meine Datenbank absetzen. Dazu habe ich zunächst in Java eine Methode definiert, die ein stored procedure anlegt. Die gesamte Anwendung läuft 10 Minuten lang und ich möchte sowohl erfolgreiche Transaktionen als auch Rollbacks zählen. Das mit den Transaktionen funktioniert wunderbar, jedoch steht bei rollbacks immer 0. Ich vermute einen Fehler in Postgres, bin mir aber nicht so ganz sicher. Hier mal die relevanten Methoden:
Methode zum Erstellen des stored procedure:
Java:
public static void einzahlungFunc(Connection conn)
{
String cmmnt = "'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'";
try
{
conn.setAutoCommit(false);
Statement stmt = conn.createStatement();
stmt.execute("CREATE OR REPLACE FUNCTION einzahlungFunc(integer, integer, integer, integer)"+
"RETURNS integer AS " +
"$$"+
" DECLARE accbalance int;"+
"BEGIN"+
" UPDATE branches SET balance = balance + $4 WHERE branchid = $3;"+
" UPDATE tellers SET balance = balance + $3 WHERE tellerid = $2;"+
" UPDATE accounts SET balance = balance + $4 WHERE accid = $1;"+
" SELECT balance INTO strict accbalance FROM accounts WHERE accid = $1;"+
" INSERT INTO history VALUES ($1, $2, $4, $3, (SELECT balance FROM accounts WHERE accid = $1), "+cmmnt+");"+
" RETURN accbalance;"+
"END; "+
"$$"+
"LANGUAGE plpgSQL;");
conn.commit();
stmt.close();
}
catch(SQLException e)
{
System.err.println(e);
System.exit(1);
}
}
Methode zum "callen" des stored procedure:
Java:
private int einzahlungTX(int accid, int tellerid, int branchid, int delta) throws Exception
{
int kontostand = 0;
try
{
conn.setAutoCommit(false);
CallableStatement cstmt = conn.prepareCall("{call einzahlungfunc(?,?,?,?)}");
cstmt.setInt(1, accid);
cstmt.setInt(2, tellerid);
cstmt.setInt(3, branchid);
cstmt.setInt(4, delta);
cstmt.executeUpdate();
ResultSet rs = cstmt.executeQuery();
while(rs.next())
kontostand = rs.getInt(1);
}
catch (Exception e)
{
if(conn!=null)
{
conn.rollback();
fehlerKontostand++; // Diese Variable dient als rollback-Zähler
}
System.err.println(e);
}
conn.commit();
return kontostand;
} conn.rollback();
fehlerKontostand++;
}
System.err.println(e);
}
conn.commit();
return rowCount;
}
Erste Frage: Habe ich grundsätzlich in java alles richtig gemacht um rollbacks aufzufangen? (Rollback vor commit?)
Zweite Frage: Muss ich bei dem stored procedure noch irgendwas mit rollback einfügen?