2011-07-12 66 views
2

我们有一个基于Spring的应用程序,带有@Transactional注解的服务层。我们需要之前和之后,原因如下一些事务方法有代码的运行:在@Transactional方法之前和之后执行代码

  1. 我们需要同步访问基于密钥的方法。该线程需要在事务开始之前阻塞。
  2. 如果事务成功,我们需要在队列上发布消息。

的选项似乎是:

  1. 创建类似的方法,可以在同步块运行@Transactional方法和检查返回然后发布消息的服务类(需要由于AOP代理问题导致的单独课程)。服务呼叫服务,不好,感觉像一个解决办法。
  2. 编写一个方面来环绕可以执行同步和消息发布的@Transactional AOP。可能会工作,但宁愿避免AOP。
  3. 将事务下移到域图层。由于领域方法在不同的工作流程中被重复使用的方式,因此当前的实现不太可取或可能甚至是可行的。
  4. 在服务方法中手工编写交易并废止@Transactional。

我想这是一个相当普遍的要求。可能我错过了一个选项5,这是显而易见的选项!

回答

1

我会使用TransactionTemplate(您的选项4),并在这种情况下以编程方式控制事务的范围。否则,您可以将您的方法中的逻辑移出到单独的服务中,创建新的服务@Transactional,从当前的方法中移除@Transactional,然后用您的前置和后置环绕呼叫到新服务事务后逻辑。我也采取了这种方法,但我更喜欢programmatic transaction management这样的要求,因为我认为它更清洁,并且正如你所提到的,服务调用服务(这只是第一个服务所需要的),就像是一个骇人的解决方法。

3

我想我会和2一起去,除非你有一些特定的理由来避免AOP。你的问题是AOP可以使用的典型例子,它的结果看起来不错。这里有一个很好的例子来说明如何实现(如果你没有阅读过):Advising transactional operations

如果AOP真的不是一个选项,我会选择@Lawrence McAlpin提出的'其他'选项。

+0

同意这一点,我不明白为什么人们会想在这种情况下避免AOP。这是最干净的方法。 –

+1

这是要走的路,毕竟@Transactional也使用AOP。所以连接另一个方面将是最好和最简单的事情。 –

+2

绝对使用AOP。正如@Sean指出的那样,您已经在使用@Transactional来使用Spring AOP,并且Spring特别支持[定位注释的切入点表达式](http://static.springsource.org/spring/docs/3.1.x/spring-framework -reference/html/aop.html#aop-pointcuts-designators),所以你可以告诉它在没有额外工作的情况下每个@Transactional方法运行。 –

2

退房TransactionSynchronization回调界面。 Spring可以自然地告诉你事务发生了什么。

+0

Tomasz对邮件发布要求非常有用,谢谢。其实这可能是我们也遇到的其他一些长期问题的解决方案,这非常棒。 –

0

如果键被作为方法调用的一部分传递,那么你可以使用Java ReentrantLock做的工作..其简单得多&清洁。

相关问题