我有2个使用spring @Transactional注释的方法。
@Transactional(readOnly = true)
public ConfigParameter getConfigParameter(String key) {
@Transactional(readOnly = false)
public void setConfigParameter(ConfigParameter param) {
readOnly = false表示该方法将通过同步。 当setter上的 readyOnly = false 设置时,意味着对同步设置器的访问。
你是否同意在这种情况下,getter也应该将readOnly设置为true(同步)。因为否则我们将面临返回Object的不一致状态的风险。
当我用FindBugs检查这个类并得到警告时,我遇到了这个问题:
非同步get方法,同步集方法 这个类包含 类似命名的get和set方法,其中set方法是 synchronized和get方法不是。这可能导致错误 运行时的行为,因为get方法的调用者不一定 看到对象的一致状态。应该制作get方法 同步。
答案 0 :(得分:1)
Spring @Transactional
语义和同步完全是两个不同的东西 - 使用@Transactional(readOnly = false)
注释setter不会使方法同步,就好像你要声明它一样:
public synchronized void setConfigParameter(ConfigParameter param)
read-only
标志只是对底层持久性引擎的一个命中 - 事务管理器可以解释提示意味着当前事务是只读的 - 所以与线程的执行方式无关方法。
答案 1 :(得分:0)
我认为你没有正确地考虑这个问题。交易注释不属于这些方法。