java - Java synchronized关键字与Spring @Transactional注解的逻辑对比

标签 java multithreading hibernate spring transactions

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

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

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


一些更新。

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

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

最佳答案

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

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

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

关于java - Java synchronized关键字与Spring @Transactional注解的逻辑对比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6479283/

相关文章:

java - 看似正确的 BFS 实现查找路径,但不是*最短*路径(失重边)

java - 同步线程执行顺序的变化

java - Java文档中的volatile变量解释

hibernate - 合并后原始对象将变成什么

java - 如何验证 REST 服务中的传入 JSON 数据?

java - 使用 url 表达式

java - Java Concordion 子字符串 ("contains"的解决方法)

c# - LogicalCallContext 中 Hashtable 的线程安全

java - hibernate_sequence不存在

mysql - 架构导出失败