Nível de isolamento SERIALIZÁVEL no Spring-JDBC
talvez alguém possa me ajudar com um problema transacional no Spring (3.1) / Postgresql (8.4.11)
Meu serviço transacional é o seguinte:
@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(...)
}
....
}
O Webapp de configuração do Spring contém:
@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());
}
}
Digamos que um pedido "x" e um pedido "y" sejam executados simultaneamente e cheguem ambos ao comentário "comparação" (método insertObject). Em seguida, ambos podem inserir um novo objeto e suas transações são confirmadas.
Por que não estou tendo uma RollbackException? Tanto quanto eu sei, é para isso que serve o nível de isolamento Serializável. Voltando ao cenário anterior, se x conseguir inserir um novo objeto e confirmar sua transação, a transação de "y" não deve ter permissão para confirmar, pois há um novo objeto que ele não leu.
Isto é, se "y" puder ler novamente o valor de secondDao.getNumerOfExistingObjects (bar), perceberá que existe um novo objeto a mais. Fantasma?
A configuração da transação parece estar funcionando bem:
Para cada pedido, posso ver a mesma conexão para firstDao e secondDaoUma transação é criada toda vez que insertObject é invocadoOs primeiro e segundo DAOs são os seguintes:
@Autowired
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public Object daoMethod(Object param) {
//uses jdbcTemplate
}
Tenho certeza de que estou perdendo alguma coisa. Qualquer ideia?
Obrigado pelo seu tempo,
Javier