Javasynchronized关键字与Spring@Transactional注解的逻辑对比

2023-12-24

在一次关于 Spring/Hibernate 事务的演讲中,我提出了一个观点:synchronized方法上的关键字和@Transactional逻辑上有很多相似之处。果然,它们是完全不同的野兽,但它们都作为方法的方面应用,并且都通过某种共享监视器(例如,记录在数据库中)控制对某些资源的访问。

人群中有几个人立即反对并声称我的比较是致命的错误。我不记得具体的论点,但我也可以在这里看到一些观点。例如,synchronized从一开始就适用于整个方法,并且事务仅在到达访问数据库的语句时才会生效。加synchronized不提供任何读/写锁定模式。

所以问题是,我的比较是否完全错误,我永远不应该使用它,或者,用适当的措辞,将它呈现给经验丰富的工程师,他们知道如何使用它是否有意义synchronized有效但还想了解 AOP 事务?这个写法应该是什么?


一点更新。

显然我的问题听起来像是比较数据库事务与输入synchronizedJava 中的方法。事实并非如此。我的想法更多的是比较语义上的相似性@Transactional and synchronized.

我提出它的原因之一也是为了说明传播行为。例如,如果@Transactional是 PROPAGATION_REQUIRED 它将与进入有很多相似之处synchronized堵塞。对于交易:如果交易存在,我们就继续使用它,如果没有,我们将创建一个。为了synchronized,如果我们已经有监视器,我们将继续使用它,如果没有,我们将尝试获取它。当然是为了@Transactional我们不会锁定方法边界。


如果我们看一下@Transactional作为表示锁定数据库资源的方法(因为它在事务中使用) - 那么比较就有意义。

然而,这就是他们的共同点。同步是在对象监视器上定义的(并且仅保护它),在使用关键字时已知,而事务可能会锁定多个资源(在事务开始时未知),或者可能不锁定任何资源根本没有(乐观锁定、只读事务)。

所以最终 - 不要使用这种比较,它们的不同之处比它们的共同点要多得多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javasynchronized关键字与Spring@Transactional注解的逻辑对比 的相关文章

随机推荐