を読み取ることができません。春のトランザクションは、私が春を使用していますとJUnit-方法を以下している更新された値
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:TestProject-spring-test.xml" })
@Transactional
public abstract class BaseTest {
[...]
@Test
public void testSaveLoadedObject() {
SubTestModel st = modelService.load(subTestPk);
st.setSimpleObject("testString");
modelService.save(st);
//now reload the object to ensure that everything has been saved correctly
st = modelService.load(st.getId());
s+= "\n#3 afterLoad: " + st.getSimpleObject();
//fails:
Assert.assertTrue(st.getSimpleObject().equals("testString"));
}
}
ModelService-方法:
@Autowired
private JdbcTemplate db;
@Override
@Transactional(propagation = Propagation.REQUIRED)
public void save(final ItemModel model, String newValue) {
db.update("UPDATE table SET column=? WHERE id=?", new Object[] { newValue, model.getId() });
}
@Override
public <T extends AbstractItemModel> T load(final int id) {
...
DAO.loadValue(...)
}
DAO-方法: @Autowired プライベートJdbcTemplate db;
@Override
public <T> T loadValue(final AbstractItemModel model, final String columnName) {
final String sql = "SELECT column FROM table WHERE id=" + model.getId();
Object plain = db.queryForObject(sql, new RowMapper<Object>() {
@Override
public Object mapRow(ResultSet r, int rowNum) throws SQLException {
return r.getObject(columnName);
}
});
return plain;
}
続いて起こる:
をMySQLで( "SET SESSIONトランザクション分離レベルREAD UNCOMMITTED" を設定する際に目に見える)新しい値がDBに格納されます。 。
DB = "たTestString"*が、loadメソッドが呼び出されたとき、それは "古い"(=値が前に保存)値を取得します*
getSimpleObject-値で
getSimpleObject価値デバッガ= "simpleObjectValue"
ロードメソッドによって(同じトランザクションとメソッドで)最近保存された値を読み取ることができないのはなぜですか?
新しいトランザクションは作成されません。テストメソッド全体で "@トランザクション(分離= READ_UNCOMMITTED)"で隔離レベルを設定しても助けにならない
誰でもこの謎を解くことができますか?
ありがとうございます!
すべては、ロードと保存の方法によって異なります。コードは重要です。 –
hi。 saveはjdbctemplateを実行します。 "INSERT INTO ..." loadはjdbctemplate..queryForObject(...)を実行します – Niko
さらに詳しい情報が必要ですか? – Niko