Ale*_*man 6 java spring multithreading hibernate transactions
在关于 Spring/Hibernate 事务的一次演讲中,我提出了一种观点,即synchronized方法@Transactional上的关键字和逻辑上有许多相似之处。果然,它们是完全不同的野兽,但它们都作为方法的方面应用,并且都通过某种共享监视器(例如,记录在 db 中)控制对某些资源的访问。
人群中有几个人立即反对并声称我的比较是致命的错误。我不记得具体的论点,但我也可以在这里看到一些观点。例如,synchronized从一开始就对整个方法起作用,事务只有在到达访问 DB 的语句时才会生效。Plussynchronized不提供任何读/写锁定模式。
所以问题是,我的比较是完全错误的synchronized吗,我永远不应该使用它,或者,用正确的措辞,将它呈现给熟悉如何工作但仍试图了解 AOP 事务的经验丰富的工程师是否有意义?这个写法应该是什么?
一点点更新。
显然,我的问题听起来像是比较数据库事务与synchronizedJava 中的输入方法。事实并非如此。我的想法更多是关于比较@Transactional和语义的相似性synchronized。
我提出它的原因之一也是为了说明传播行为。例如,如果@Transactional是 PROPAGATION_REQUIRED,它将与进入synchronized块有许多相似之处。对于交易:如果存在交易,我们就继续使用它,如果没有,我们将创建一个。对于synchronized,如果我们已经有了监视器,我们将继续使用它,如果没有,我们将尝试获取它。当然,@Transactional我们不会锁定方法边界。
如果我们将其视为@Transactional表示锁定数据库资源的方法(因为它在事务中使用),那么这种比较就有意义。
然而,这就是他们的共同点。同步是在对象监视器上定义的(并且仅保护它),该监视器在使用关键字时已知,而事务可能会锁定多个资源(在事务开始时未知),或者可能不锁定任何资源根本没有(乐观锁定、只读事务)。
所以最终 - 不要使用这种比较,它们的不同之处比共同点要多得多。
| 归档时间: |
|
| 查看次数: |
3842 次 |
| 最近记录: |