2012-01-27 54 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