也许有人可以帮助我解决 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”和一个请求“y”同时执行并到达注释“comparison”(方法 insertObject)。然后他们都被允许插入一个新对象并提交他们的事务。
为什么我没有 RollbackException?据我所知,这就是 Serializable 隔离级别的用途。回到前面的场景,如果 x 设法插入一个新对象并提交它的事务,那么不应允许“y”的事务提交,因为有一个他没有读取的新对象。
也就是说,如果“y”可以再次读取 secondDao.getNumerOfExistingObjects(bar) 的值,它将意识到还有一个新对象。幻影?
事务配置似乎工作正常:
- 对于每个请求,我可以看到 firstDao 和 secondDao 的相同连接
- 每次调用 insertObject 时都会创建一个事务
第一个和第二个 DAO 如下:
@Autowired
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public Object daoMethod(Object param) {
//uses jdbcTemplate
}
我确定我错过了一些东西。任何的想法?
谢谢你的时间,
哈维尔