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 isolotation レベルの目的です。前のシナリオに戻ると、x が新しいオブジェクトの挿入に成功し、そのトランザクションをコミットした場合、"y" のトランザクションは、彼が読み取っていない新しいオブジェクトがあるため、コミットを許可されるべきではありません。
つまり、"y" が secondDao.getNumerOfExistingObjects(bar) の値を再度読み取ることができれば、さらに新しいオブジェクトがあることがわかります。ファントム?
トランザクション構成は正常に機能しているようです:
- リクエストごとに、firstDao と secondDao の同じ接続を確認できます
- insertObject が呼び出されるたびにトランザクションが作成される
最初と 2 番目の DAO は次のとおりです。
@Autowired
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Override
public Object daoMethod(Object param) {
//uses jdbcTemplate
}
私は何かが欠けていると確信しています。何か案が?
御時間ありがとうございます、
ハビエル