也许有人可以帮我解决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)的值,它将意识到有更多的新对象.幻影?
事务配置似乎工作正常:
第一个和第二个DAO如下: …