Nivel de aislamiento SERIALIZABLE en Spring-JDBC

quizás alguien pueda ayudarme con un problema transaccional en Spring (3.1) / Postgresql (8.4.11)

Mi servicio transaccional es el siguiente:

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

La webapp de configuración de Spring contiene:

@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 una solicitud "x" y una solicitud "y" se ejecutan simultáneamente y llegan al comentario "comparación" (método insertObject). Entonces a ambos se les permite insertar un nuevo objeto y se comprometen sus transacciones.

¿Por qué no tengo una RollbackException? Por lo que sé, para eso es el nivel de isolización Serializable. Volviendo al escenario anterior, si x logra insertar un nuevo objeto y confirma su transacción, entonces no se debe permitir la transacción de "y", ya que hay un nuevo objeto que no leyó.

Es decir, si "y" pudiera leer nuevamente el valor de secondDao.getNumerOfExistingObjects (bar) se daría cuenta de que hay un nuevo objeto más. ¿Fantasma?

La configuración de la transacción parece estar funcionando bien:

Para cada solicitud puedo ver la misma conexión para firstDao y secondDaoSe crea una transacción cada vez que se invoca insertObject

Tanto el primer como el segundo DAO son los siguientes:

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

@Override
public Object daoMethod(Object param) {

        //uses jdbcTemplate

}

Estoy seguro de que me estoy perdiendo algo. ¿Alguna idea?

Gracias por tu tiempo,

Javier

Respuestas a la pregunta(1)

Su respuesta a la pregunta