gpt4 book ai didi

java - Spring Transactional 无法读取更新的值

转载 作者:太空宇宙 更新时间:2023-11-04 12:42:13 24 4
gpt4 key购买 nike

我正在使用 Spring 并有以下 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"));
}
}

模型服务方法:

@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 私有(private) JdbcTemplate 数据库;

@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;

}

发生以下情况:

原始值: enter image description here

新值存储在 mysql 的数据库中(在设置“SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED”时可见)。

DB 中的 getSimpleObject-Value =“testString” enter image description here

*但是当调用 load 方法时,它会获取“旧”(=保存之前的值)值 *

调试器中的 getSimpleObject-Value = "simpleObjectValue"

为什么加载方法无法读取最近保存的值(在同一事务和方法中)?

您会看到它没有创建新事务。即使在整个测试方法上使用“@Transaction(isolation=READ_UNCOMMITTED)”设置隔离级别也无济于事

有人能解开这个谜团吗?

提前致谢!

最佳答案

在保存方法上将传播更改为 REQUIRES_NEW(以在数据库上提交更改并打开新事务)。

或者更好的是,在保存测试后添加刷新调用(更好,因为您不会仅仅为了适应集成测试而更改代码)。

关于java - Spring Transactional 无法读取更新的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36722811/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com