Уровень изоляции SERIALIZABLE в Spring-JDBC
Может быть, кто-нибудь может помочь мне с транзакционной проблемой в Spring (3.1) / Postgresql (8.4.11)
Мой транзакционный сервис выглядит следующим образом:
@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(...)
}
....
}
Конфигурация Spring Webapp содержит:
@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());
}
}
Допустим, запрос «x» и запрос "у"; выполнить одновременно и получить оба комментария & quot; сравнение & quot; (метод insertObject). Затем им обоим разрешается вставлять новый объект, и их транзакции фиксируются.
Почему у меня нет RollbackException? Насколько я знаю, для этого и нужен уровень Serializable. Возвращаясь к предыдущему сценарию, если x удается вставить новый объект и зафиксировать его транзакцию, то транзакция «y» не должна быть разрешена для фиксации, поскольку существует новый объект, который он не прочитал.
То есть, если «у» мог бы снова прочитать значение secondDao.getNumerOfExistingObjects (bar), он бы понял, что есть новый объект больше. Phantom?
Конфигурация транзакции работает нормально:
For each request I can see the same connection for firstDao and secondDao A transaction is created everytime insertObject is invokedКак первый, так и второй DAO:
@Autowired
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public Object daoMethod(Object param) {
//uses jdbcTemplate
}
Я уверен, что что-то упустил. Любая идея?
Спасибо за ваше время,
Хавьер