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 insertObjectZaró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