2

我有 2 种带有 spring @Transactional 注释的方法。

@Transactional(readOnly = true) 
public ConfigParameter getConfigParameter(String key) { 

@Transactional(readOnly = false) 
public void setConfigParameter(ConfigParameter param) {

readOnly = false 表示该方法将被同步。当在 setter 上设置readyOnly = false时,意味着对 setter 的访问是同步的。

您是否同意在这种情况下,getter 也应该将 readOnly 设置为 true(同步)。因为否则我们将面临返回对象状态不一致的风险。

当我用 FindBugs 检查这个类并收到警告时,我遇到了这个问题:

不同步的 get 方法,同步的 set 方法 此类包含名称相似的 get 和 set 方法,其中 set 方法是同步的,而 get 方法不是。这可能会导致运行时的错误行为,因为 get 方法的调用者不一定会看到对象的一致状态。get 方法应该是同步的。

4

2 回答 2

1

Spring@Transactional语义和同步完全是两个不同的东西——用注解 setter@Transactional(readOnly = false)不会使方法同步,就好像你会这样声明它:

public synchronized void setConfigParameter(ConfigParameter param)

read-only标志只是对底层持久性引擎的一个打击——该提示可能被事务管理器解释为意味着当前事务是只读的——因此与线程如何执行该方法无关。

于 2012-10-23T11:28:49.993 回答
0

我认为你没有正确考虑这个问题。事务注释不属于这些方法。

于 2012-10-23T11:28:24.610 回答