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