【问题标题】:In spring declarative transaction management when transaction commited在事务提交时的春季声明性事务管理
【发布时间】:2014-08-10 21:44:01
【问题描述】:

如问题所述,实际事务在春季声明性事务管理中提交的位置。例如,假设我有以下代码

@Service
@Transactional
class CustomerAService{
    public void processCustomer(Customer customer){
        //call dao and insert customer
        furtherProcessCustomer(Customer customer);
        //last line (a)
    }

    @Transactional(propagation=Propagation.REQUIRES_NEW)
    public void furtherProcessCustomer(Customer customer){
        //call another dao do some db work

        //last line (b)
    }
}

假设如果我停止执行@ line //last line (a),那么 processCustomer() 方法的事务将被提交。我试图在网上搜索,但没有得到太多信息

【问题讨论】:

  • @WornOutSoles 虽然我的问题与 Propagation.REQUIRES_NEW 无关,但在阅读 beerbajay 的回答后,我对 Propagation.REQUIRES_NEW 的使用有点困惑。对于那个病在网上找到一些信息,否则问问题。

标签: java spring spring-mvc jdbc transactions


【解决方案1】:

Spring 中的事务管理通过面向方面编程 (AOP) 代理对象进行。这意味着该方法必须干净地返回才能提交事务。您的代码是下图中的“目标方法”,而事务是在“事务顾问”中提交的。 More documentation here.

你的例子有点微妙,因为furtherProcessCustomer方法是从内部同一个类调用的,不会通过AOP代理对象调用,因此你的@Transactional(propagation=Propagation.REQUIRES_NEW)不会被使用。

如果您有另一个服务,也带有 @Transactional 注释,然后您调用了 furtherProcessCustomer,这将通过 AOP 代理对象发生,因此您将拥有一个嵌套事务。

【讨论】:

  • 你能给我一些网址,我可以在其中获取有关信息的信息>>进一步的ProcessCustomer方法是从同一个类内部调用的,它不会通过AOP代理对象调用,因此你的@Transactional(propagation= Propagation.REQUIRES_NEW) 将不会被使用
  • Spring 文档清楚地解释了 beerjay 指出的内容:docs.spring.io/spring/docs/3.1.x/spring-framework-reference/…。寻找这个:“然而,一旦调用最终到达目标对象,在这种情况下是 SimplePojo 引用,它可能对自身进行的任何方法调用,例如 this.bar() 或 this.foo(),都会进行针对 this 引用而不是代理调用”
  • @WornOutSoles 想看看。
猜你喜欢
  • 2012-04-21
  • 1970-01-01
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 2014-02-19
  • 2011-04-22
  • 2015-04-18
相关资源
最近更新 更多