2016-06-10 64 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