Isolationsstufe SERIALIZABLE in Spring-JDBC
Vielleicht kann mir jemand bei einem Transaktionsproblem in Spring (3.1) / Postgresql (8.4.11) helfen
Mein Transaktionsservice lautet wie folgt:
@Transactional(isolation = Isolation.SERIALIZABLE, readOnly = false)
@Override
public Foo insertObject(Bar bar) {
// these methods are just examples
int x = firstDao.getMaxNumberOfAllowedObjects(bar)
int y = secondDao.getNumerOfExistingObjects(bar)
// comparison
if (x - y > 0){
secondDao.insertNewObject(...)
}
....
}
Die Spring-Konfigurations-Webapp enthält:
@Configuration
@EnableTransactionManagement
public class ....{
@Bean
public DataSource dataSource() {
org.apache.tomcat.jdbc.pool.DataSource ds = new DataSource();
....configuration details
return ds;
}
@Bean
public DataSourceTransactionManager txManager() {
return new DataSourceTransactionManager(dataSource());
}
}
Sagen wir, eine Anfrage "x" und eine Anfrage "y" werden gleichzeitig ausgeführt und kommen beide zum Kommentar "Vergleich" (Methode insertObject). Dann dürfen beide ein neues Objekt einfügen und ihre Transaktionen werden festgeschrieben.
Warum habe ich keine RollbackException? Soweit ich weiß, ist das der Zweck der serialisierbaren Isolationsstufe. Zurück zum vorherigen Szenario: Wenn x ein neues Objekt einfügen und die Transaktion festschreiben kann, darf die Transaktion von "y" nicht festschreiben, da es ein neues Objekt gibt, das er nicht gelesen hat.
Das heißt, wenn "y" den Wert von secondDao.getNumerOfExistingObjects (bar) erneut lesen könnte, würde es erkennen, dass es ein neues Objekt mehr gibt. Phantom?
Die Transaktionskonfiguration scheint gut zu funktionieren:
Für jede Anfrage kann ich die gleiche Verbindung für firstDao und secondDao sehenBei jedem Aufruf von insertObject wird eine Transaktion erstelltSowohl der erste als auch der zweite DAO lauten wie folgt:
@Autowired
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public Object daoMethod(Object param) {
//uses jdbcTemplate
}
Ich bin mir sicher, dass mir etwas fehlt. Irgendeine Idee?
Vielen Dank für Ihre Zeit,
Javier