为什么我在两个相同的查询之间得到相同的结果?

时间:2012-01-27 12:58:06

标签: java mysql

我正在开发一个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管理器中的更改。任何人都可以告诉我为什么会这样?我会非常感谢任何帮助。谢谢! (因此我的英语不好,我希望我已经足够清楚了。)

1 个答案:

答案 0 :(得分:6)

MySQL中的默认事务隔离级别是REPEATABLE READ,这是the manual告诉它的内容

  

如果事务隔离级别是REPEATABLE READ(默认值)   等级),同一事务中的所有一致读取读取   由该事务中的第一个这样的读取建立的快照。您   通过提交当前可以为您的查询获取更新的快照   交易以及发出新查询之后。

简而言之,这意味着如果您在交易期间阅读某些内容,则同一交易中所有后续读取相同数据的内容将返回相同的结果,这正是您所看到的。