如何在进行一组查询时避免更改数据库?

时间:2014-01-15 14:20:04

标签: java mysql spring jpa transactions

在我的Web应用程序(Java + Spring + JPA)中,我有一个执行一组相关查询的方法。特别是我需要知道表的总行数和特定查询的结果集的行数。

显然,在这两个查询之间,我的表中可能会发生更改:添加了新行,删除了行,更改了字段值等。

表有数百万行,因此无法将整个表加载到内存中并在应用程序上下文中进行过滤。

所以我需要找到一种方法来执行一组查询,为表保持相同的“状态”(某种快照)。 在同一个事务中执行查询是否足够,还是有其他方法?

更新 该方法用于表格分页。我需要显示从 m 页面(SEARCH)中取得的 n 行(PAGE),这些行是从总共 t 现有行(TOTAL)中过滤掉的。< / p>

所以基本上我需要提取n条记录并提供两个数字信息:过滤行数和总行数。

我可以执行SELECT count(*) from table,然后SELECT count(*) from table where <search criteria>然后SELECT * from table where <search criteria> limit <n>,但我必须确保两者之间没有任何变化......

我正在使用MySQL 5

1 个答案:

答案 0 :(得分:0)

我在MySQL 5.5.28中的测试表明,您可以依赖于简单地处于事务中的事实不会计算任何新的插入/删除/更改的行(处于REPEATABLE READ事务隔离级别)。这意味着,COUNT()受事务隔离级别的限制。根据{{​​3}}这种模式正是您想要的:基于第一次读取的基于快照的读取。