Spring @Transactional并发

时间:2010-09-14 11:35:43

标签: java spring transactions concurrency synchronization


class MyService {

public void a() { synchronized(somekey) { b(); } }

@Transactional(propagation = Propagation.REQUIRES_NEW) public void b() { ...do DB works... } }

我的目标是

    1 - 获取密钥
    2 - 开始交易
    3 - 提交交易
    4 - 释放密钥

当我从外部调用()方法时,事务不起作用。

有什么建议吗?

感谢。

5 个答案:

答案 0 :(得分:4)

除非你使用代码编织,否则这不起作用。

Spring处理事务的默认方式是AOP proxies。对事务方法的调用如下:

 caller --> ProxyClass.a() --> YourClass.a()

如果在同一个对象上调用另一个方法,则不会通过代理,因此没有事务行为。

 caller --> ProxyClass.a() --> YourClass.a() --> YourClass.b()

如果您不想使用AspectJ,可以使用AopContext.currentProxy()获取代理对象。

答案 1 :(得分:1)

不是100%肯定。我认为所有@Transactional调用必须在事务开始的同一个线程上完成。我肯定知道 @Transactional不能跨线程。 (我想通过设计)

答案 2 :(得分:0)

我很好奇钥匙的性质。为什么服务会产生它?不会有替代设计将其放入数据库吗?

如果没有错误信息,很难确切地说出错误。

答案 3 :(得分:0)

如果您想在b()内拨打a(),并且想要进行b()交易,则必须将其放入单独的课程中。

答案 4 :(得分:0)

对b()的方法调用是内部调用,而非Henning所说的事务代理。

this博文中解释了整件事。