相关疑难解决方法(0)

Spring-JDBC中的隔离级别SERIALIZABLE

也许有人可以帮我解决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(...) 
            }
            ....
}
Run Code Online (Sandbox Code Playgroud)

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

让我们说请求"x"和请求"y"同时执行并且到达注释"比较"(方法insertObject).然后允许它们都插入一个新对象并提交它们的事务.

为什么我没有RollbackException?据我所知,这是Serializable isolotation级别的用途.回到上一个场景,如果x设法插入一个新对象并提交其事务,则不应该允许"y"的事务提交,因为有一个他没有读过的新对象.

也就是说,如果"y"可以再次读取secondDao.getNumerOfExistingObjects(bar)的值,它将意识到有更多的新对象.幻影?

事务配置似乎工作正常:

  • 对于每个请求,我可以看到firstDao和secondDao的相同连接
  • 每次调用insertObject时都会创建一个事务

第一个和第二个DAO如下: …

java postgresql spring transactions spring-transactions

4
推荐指数
1
解决办法
4647
查看次数