Poziom izolacji SERIALIZABLE w Spring-JDBC

może ktoś może mi pomóc w kwestii transakcyjnej na wiosnę (3.1) / Postgresql (8.4.11)

Moja usługa transakcyjna wygląda następująco:

@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(...) 
            }
            ....
}

Webapp w konfiguracji Spring zawiera:

@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());
    }
}

Powiedzmy, że żądanie „x” i żądanie „y” wykonuje się równocześnie i dociera zarówno do komentarza „porównanie” (metoda insertObject). Następnie obaj mogą wstawić nowy obiekt i zatwierdzić ich transakcje.

Dlaczego nie mam wyjątku RollbackException? O ile mi wiadomo, taki jest poziom Serolotizable isolotation. Wracając do poprzedniego scenariusza, jeśli x uda się wstawić nowy obiekt i zatwierdzić swoją transakcję, wówczas transakcja „y” nie powinna być dozwolona do zatwierdzenia, ponieważ istnieje nowy obiekt, którego nie odczytał.

Oznacza to, że gdyby „y” mogło ponownie odczytać wartość secondDao.getNumerOfExistingObjects (słupka), uświadomiłoby sobie, że istnieje więcej nowego obiektu. Fantom?

Konfiguracja transakcji działa prawidłowo:

Dla każdego żądania widzę to samo połączenie dla firstDao i secondDaoTransakcja jest tworzona za każdym razem, gdy wywoływany jest obiekt insertObject

Zarówno pierwsze jak i drugie DAO są następujące:

@Autowired
public void setDataSource(DataSource dataSource) {
    this.jdbcTemplate = new JdbcTemplate(dataSource);
}

@Override
public Object daoMethod(Object param) {

        //uses jdbcTemplate

}

Jestem pewien, że coś mi brakuje. Dowolny pomysł?

Dziękuję za Twój czas,

Javier

questionAnswers(1)

yourAnswerToTheQuestion