我们有一个基于Spring的应用程序,其服务层使用@Transactional注释。我们需要在某些事务方法之前和之后运行代码,原因如下:
选项似乎是:
我认为这是一个相当普遍的要求。可能我错过了一个选项5,这是显而易见的选择!
答案 0 :(得分:4)
我认为除非你有一些特定的理由要避免AOP,否则我会选择2。您的问题是AOP可以使用的典型示例,结果看起来相当不错。这是一个很好的例子,说明如何实现它(如果你还没有读过):Advising transactional operations
如果AOP真的不是一个选项,我会选择@Lawrence McAlpin提出的'其他'选项。
答案 1 :(得分:2)
查看TransactionSynchronization回调界面。 Spring可以原生地通知您交易发生的事情。
答案 2 :(得分:1)
我会使用TransactionTemplate(您的选项4)并在这种情况下以编程方式控制事务的范围。
否则,您可以将方法中的逻辑移到单独的服务中,创建新服务@Transactional,从当前方法中删除@Transactional,然后使用您的前置和后置将调用包围到新服务 - 交易逻辑。我也采用了这种方法,但我更喜欢programmatic transaction management这样的要求,因为我觉得它更干净,正如你所提到的,呼叫服务的服务(只有第一次服务才需要)才感觉像一个黑客的解决方法。
答案 3 :(得分:0)
如果密钥是作为方法调用的一部分传递的,那么你可以使用java ReentrantLock来完成工作..它更简单&清洁剂。