在我的應用程序中,每當調用服務類函數時,都會在數據庫中創建跟蹤記錄。以下是一個僞代碼。如何在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