2009-11-11 57 views
2

我應該如何測試一個同步使用的事務性服務方法(它通過減少值來更新數據庫行)?測試對交易服務的同時調用

我已經用SpringJunit4ClassRunner設置了一個JUnit測試類,並且組件是@autowired。

只是產卵的線程,將調用該方法似乎不工作。我不確定這是否與Spring代理機制有關。

我想達到的目的是創建一種情況,即兩個線程同時在被測方法的「內部」,另一個線程將失敗並回滾。例如行值是3,兩個方法調用都嘗試將值減2;如果該方法不起作用,則該值爲-1,這是非法的。但是我希望這兩個調用都會失敗並回滾,或者嘗試更新它的時間晚於另一個。

這甚至可能嗎?

+0

你應該解釋什麼時候產卵線程不工作。 – tangens 2009-11-11 13:42:44

+0

我在可調用方法的開始(它只是一個私有方法調用)或者表示該表不存在的hibernate異常時,得到了一個空指針異常,這很奇怪,因爲在一個測試方法中, T線程工作正常。 – egaga 2009-11-11 13:57:52

回答

4

第一個問題是,綁定到一個線程(帶有本地線程)的事務上下文是。所以你必須在你的每個線程中開始一個事務。 (我認爲這是在春天這個不支持您可以用transaction manager編程開始交易。)

的代碼,你描述的:讀,減量,寫操作只用正確的隔離級別(序列化和可重複的工作閱讀將工作)。

完成此設置後,您可以通過在數據庫鎖定期間阻止一個線程來測試行爲。你可以使用這個Latch

沒有數據庫鎖定的線程現在仍然不會回滾。它會阻塞,直到數據庫鎖再次可用。您所描述的方案與Optimistic concurrency control非常類似,所以可能已經實施。

+0

這聽起來很像我想要的。我會試着看看我是否能夠讓所有的東西都能工作。謝謝! – egaga 2009-11-11 14:23:15