Уровень изоляции 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());
}
}
Давайте скажем запрос «х» и запрос "у" выполнить одновременно и получить оба комментариясравнение» (метод insertObject). Затем им обоим разрешается вставлять новый объект, и их транзакции фиксируются.
Почему у меня нет RollbackException? Насколько я знаю, для этого и нужен уровень Serializable. Возвращаясь к предыдущему сценарию, если x удастся вставить новый объект и зафиксировать его транзакцию, тогда "y" 'Не следует разрешать транзакцию s, поскольку есть новый объект, который он не читал.
То есть если "у" мог бы снова прочитать значение secondDao.getNumerOfExistingObjects (bar), он бы понял, что есть новый объект больше. Phantom?
Конфигурация транзакции работает нормально:
Для каждого запроса я вижу одно и то же соединение для firstDao и secondDao.Транзакция создается каждый раз, когда вызывается insertObjectКак первый, так и второй DAO:
@Autowired
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public Object daoMethod(Object param) {
//uses jdbcTemplate
}
Я уверен, что что-то упустил. Любая идея?
Спасибо за ваше время,
Хавьер