2012-01-27 84 views
2

我正在開發一個JSF項目。我們的開發基於MySql 5.1,JBoss 4.22GA,今天我遇到了一些麻煩,希望有人能幫我弄明白。爲什麼我在兩個相同的查詢之間得到相同的結果?

以下是情況:由於某些原因,我必須對錶格進行一些更新,然後看看我們是否可以找到這些更改。爲此,我調用下面的方法。

create table `table` (
    id int, 
    update_date datetime, 
); 

// consider this method as one transaction 
somemethod() { 

    A. select max(update_date) from table where id = 1; 

    B. update table set update_date = now() where id = 1; 

    C. select max(update_date) from table where id = 1; 
} 

需要注意的是:

1.we break after A (you know using break point in eclipse) 

2.we execute B from somewhere outside application (which means execute update in something like GUI DB manager) 

3.after B we proceed to execute C (same we did as A) 

,我們得到了相同的結果,因爲我們沒有在A.但我們可以確認在GUI DB管理器的變化。任何人都可以告訴我爲什麼會發生這種情況?我會非常感謝任何幫助。謝謝! (因此我的英語不好,我希望我已經做了我自己很清楚。)

+0

檢查緩存設置。你如何連接到數據庫? – MrKiane 2012-01-27 13:00:49

+0

嗨,謝謝你的回覆。我們使用JDBC連接到數據庫。請問我應該看看什麼緩存設置? – redfoxlee 2012-01-27 14:10:42

回答

6

在MySQL默認的事務隔離級別是可重複讀,這是the manual講述它

如果事務隔離級別爲REPEATABLE READ(默認 級別),則同一事務中的所有一致性讀取將讀取該事務中第一次讀取所創建的快照 。您可以通過提交當前的 交易並在發出新的查詢之後爲您的查詢獲取更新鮮的快照。

簡而言之,這意味着如果您在事務處理過程中讀取某些內容,則在同一事務中所有後續讀取的相同數據將返回相同的結果,這正是您所看到的結果。

+0

謝謝你的回覆。這對我很有幫助。實際上,我們正計劃複製一些具有少量定製的行,並將它們插入到A和C之間的同一張表中,而無需鎖定表。所以我們必須確保我們有這部分數據的正確副本。如果我們選擇提交當前事務,那麼意味着回滾操作不適用於插入操作?或者我們只需要插入單獨的事務? – redfoxlee 2012-01-27 14:31:26

相關問題