2016-09-17 11:14
全程没有使用事务,必然会有问题,核心在于任务调度线程在获取 task 记录,并让该记录的 lock 由 0 变 1 的过程在事务中并且是排它的,核心代码大致是如下的形式:
final Ret ret = Ret.create();
boolean isOk = Db.tx(new IAtom() {
public boolean run() {
Task taskList = Db.find("select * from task where lock=0");
String idList = IdKit.join(taskList); // 将 taskList 的所有 id 变成这样:(1,2,3)
int n = Db.update("update task set lock=1 where lock=0 and id in" + idList);
ret.put("taskList", taskList);
return taskList.size() == n && n > 0; // 只有取出来的数量与更新数量相同时才可以提交事务
}
}
if (isOk) {
处理 ret.get("taskList")
} else {
未获取到可处理的 task
}
2016-09-14 17:45
@zy625080069 jfinal 手册中有详细说明,在此下载手册:http://www.jfinal.com/download?file=jfinal-2.2-manual.pdf
2016-09-14 11:51
@sphsyv 为保障 jfinal 的极简性,能被划分为 jfinal 核心的常用的功能才会被做到 jfinal.jar 中去,所以 jfinal 开源四年以来,经历过 20 多个版本的升级,仍然保持在 300KB 左右大小的体积
jfinal 内部的插件与 Kit 绝大部分都可单独使用,多多支持社区发展
2016-09-14 11:18
@IvyHelen 所以 jfinal 社区会更负责任地为大家提供专注的优质分享,而不是来很多娱乐性地、扯淡的内容来浪费大家的生命,这个世界不缺少娱乐,有太多娱乐在消耗着大家的青春