我正在使用 jpa 和 mysql 运行 playframework 1.2.4。
我有一个从数据库中检索前 20 个活动的作业,将状态设置为活动以停止其他作业实例执行它们,执行活动然后获取活动的下一页并重复直到所有活动完成。但是,它似乎每隔一页跳过一次,或者我的页面大小为 20 的 20 条记录。我的逻辑如下。
long total = Activity.count(q, params);
int page = 1;
int pageSize = 20;
int pages = ...
while (page <= pages) {
JPAPlugin.startTx(false);
Collection<Activity> activities = Activity.find(query, params).fetch(page, pageSize);
for (Activity activity : activities) {
activity.status = ActivityStatus.ACTIVE;
activity.save();
}
JPAPlugin.closeTx(false);
JPAPlugin.startTx(false);
for (Activity activity : activities)
longProcessActivityInAnotherTransaction(activity);
JPAPlugin.closeTx(false);
page++;
}
但是在数据库中,我看到状态为 ACTIVE 的记录 1-20,没有状态 ACTIVE 的 21-40,状态为 ACTIVE 的 61-80 等等。
这似乎与交易有关。如果我在 while 循环中注释掉所有事务启动/关闭代码,并打印出所选活动的 ID,我可以看到所有活动都已正确选择。
另外,如果我在调试模式下运行并暂停执行中间循环,并直接针对 mysql 数据库运行生成的查询,我会看到与代码中相同的行为。当循环未执行时,sql 查询按预期执行。
我的连接字符串是:
mysql://root:pass@localhost/dbname
有什么建议么?