在我的应用程序中,每当调用服务类函数时,都会在数据库中创建跟踪记录。以下是一个伪代码。如何在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
的变化将不会被提交。
如果我理解正确,那么您希望addTrace()在自己的事务中执行,并在其返回时立即提交。这就是REQUIRES_NEW事务传播的目的。 http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#tx-propagation-requires_new。您最好使用Spring,因为它的目的是用于:用声明式事务处理。 –
是的。这就是我想要做的。将尝试并发布结果。 – TechCrunch
@JBNizet,按预期工作。我会接受这个答案,如果你发布它。 – TechCrunch