2016-06-10 49 views
1

在我的应用程序中,每当调用服务类函数时,都会在数据库中创建跟踪记录。以下是一个伪代码。如何在Java,Spring JDBC和MySQL中实现嵌套事务

public Class A { 
    Tracer tracer; 
    B b; 
    void functionA() { 
     tracer.addTrace(input); 
     TransactionManger.getTransaction(); // Transaction starts. 
     result = b.functionB(); 
     if(result == 0) { 
      // rollback 
     } else { 
      // commit 
     } 
    } 
} 

public Class B { 
    Tracer tracer; 
    int functionB() { 
     tracer.addTrace(input); 
     TransactionManger.getTransaction(); // Transaction starts. 
     // Do whatever. Return. 
    } 
} 

假设如果functionB返回0,跟踪加入到数据库中得到回退对addTrace功能写入一条记录到数据库中,在上述情况?如何避免这种情况?看起来MySQL不支持嵌套事务。所以我不能在addTrace里面得到一个新的交易并关闭它,所以在计算functionB的结果之前,functionA的变化将不会被提交。

+1

如果我理解正确,那么您希望addTrace()在自己的事务中执行,并在其返回时立即提交。这就是REQUIRES_NEW事务传播的目的。 http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#tx-propagation-requires_new。您最好使用Spring,因为它的目的是用于:用声明式事务处理。 –

+0

是的。这就是我想要做的。将尝试并发布结果。 – TechCrunch

+0

@JBNizet,按预期工作。我会接受这个答案,如果你发布它。 – TechCrunch

回答

-1

为通常的问题做好准备:您究竟想要达到什么目标?另外,你能否重申这个问题?

看来您可以先准备一个复合语句作为字符串,并在所有检查结束时提交一次。

+1

跟踪与实际交易不同,它们是不同的服务类别。所以我不能在他们之外发表一个复合陈述。 – TechCrunch