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 erstellt

Sowohl 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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage