【发布时间】:2014-03-13 14:31:34
【问题描述】:
原则上我或多或少有以下代码
@Component
public class SomeService {
@Autowired
private SettingsService settingsService;
@Autowired
private OtherService otherService;
@Transactional
public void storeData(Data d) {
settingsService.set("setting1", d.getSetting1());
settingsService.set("setting2", d.getSetting2());
settingsService.set("setting3", d.getSetting3()); // no effect
// do something with otherService
}
@Transactional
public void storeData2(Data d) {
settingsService.set("setting1", d.getSetting1());
settingsService.set("setting3", d.getSetting3());
settingsService.set("setting2", d.getSetting2()); // no effect
// do something with otherService
}
@Transactional
public void storeData3(Data d) {
settingsService.set("setting1", d.getSetting1());
settingsService.set("setting2", d.getSetting2()); // no effect
// settingsService.set("setting3", d.getSetting3());
// do something with otherService
}
@Transactional
public void storeData4(Data d) {
settingsService.set("setting1", d.getSetting1());
settingsService.set("setting2", d.getSetting2());
settingsService.set("setting3", d.getSetting3());
settingsService.set("setting3", "doesn't matter"); // works but hacky
// do something with otherService
}
// @Transactional
public void storeData5(Data d) {
settingsService.set("setting1", d.getSetting1());
settingsService.set("setting2", d.getSetting2());
settingsService.set("setting3", d.getSetting3()); // works but no TX :(
// calls to otherService go boom because there is no TX
}
}
在主配置中通过简单的@EnableTransactionManagement 启用事务管理。
SettingsService 和 OtherService 都将一些内容存储在同一个关系数据库中。
现在,当我调用一些 storeData 方法时,始终是对 settingsService 的最后一次调用没有效果,即更改不会保留在数据库中(请参阅 storeData、storeData2 和storeData3)。如果我执行最后一行两次(或尝试保留一些虚假数据),一切正常,但这显然是一个 hack (storeData4)。
奇怪的是,在所有情况下,对OtherService 的调用都可以正常保存所有内容。
SettingService的set方法可以用@Transactional注解,也可以不注解;所描述的错误行为不会改变。只有当我从SomeService 的storeData 方法中删除@Transactional 时,所有对settingsService 的调用才会生效(storeData5)。但是我真的很想要那个交易(我需要它来处理otherService)。
所以上面的行为表明服务调用原则上工作,但不是同时工作。我调试了所有东西,所有变量都设置为正确的值。我不知道这种行为的原因可能是什么以及如何进一步调试它。
【问题讨论】:
标签: java spring transactions spring-transactions