Hallo!
Ich soll als Aufgabe von der Uni in einem kleinen Programm das Lostupdate-Problem aufzeigen, dass in Abhängigkeit eines übergebenen Parameters auftreten soll oder nicht. Lostupdate funktioniert wie ich es unten aufgeschrieben habe, das Problem ist noch commit. Er kann im TRANSACTION_SERIALIZABLE-Level keines der executeUpdate, commit oder rollback durchführen, was wohl daran liegen dürfte, dass das DBMS (DB2) im Hintergrund irgendwelche Sperren setzt. Ich weiß irgendwie nicht, wie ich an dieses Problem rangehen soll, damit das Programm zum Ende läuft, habt ihr Ideen?
Danke!!
Ich soll als Aufgabe von der Uni in einem kleinen Programm das Lostupdate-Problem aufzeigen, dass in Abhängigkeit eines übergebenen Parameters auftreten soll oder nicht. Lostupdate funktioniert wie ich es unten aufgeschrieben habe, das Problem ist noch commit. Er kann im TRANSACTION_SERIALIZABLE-Level keines der executeUpdate, commit oder rollback durchführen, was wohl daran liegen dürfte, dass das DBMS (DB2) im Hintergrund irgendwelche Sperren setzt. Ich weiß irgendwie nicht, wie ich an dieses Problem rangehen soll, damit das Programm zum Ende läuft, habt ihr Ideen?
Danke!!
Code:
// 1. zwei Connections auf dieselbe Datenbank öffnen
Connection con1 = DriverManager.getConnection(...);
con1.setAutoCommit(false);
Connection con2 = DriverManager.getConnection(...);
con2.setAutoCommit(false);
// 2. Transactionlevel setzen, in Abhängigkeit vom übergegenen Parameter
if (modus.equals("lostupdate")){
con1.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
con2.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
} else{
con1.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
con2.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
}
// 3. jeweils in einem eigenen Thread werden 2 Updates durchgeführt (habs ein wenig vereinfacht)
con1.executeUpdate("UPDATE konten SET kontostand = 5 WHERE kontonr = 1");
con2.executeUpdate("UPDATE konten SET kontostand = 7 WHERE kontonr = 1");
// 4. Warten, bis die Updates ausgeführt dinf
Thread.sleep(1500);
// 5. Commit
con1.commit();
con2.commit();