jfinal事务回滚

事务回滚的问题

	public void edit(){
		int userId = getParaToInt("id");
		Integer[] groupIds = getParaValuesToInt("groupId");
		Integer[] memuIds = getParaValuesToInt("memuId");
		String name = getPara("name");
		int login = getParaToInt("login");
		int userType = getParaToInt("userType");
		String groupIdStr = ToString.toString(groupIds);
		String memuIdStr = ToString.toString(memuIds);
		UserService.me.edit(userId, name, login, userType, groupIdStr, memuIdStr);
		redirect("/user/getUserList/"+userId);
	}

其中UserService.me.edit包括

@Before(Tx.class)
	public void edit(int userId, String name, int login,int userType,String groupIds,String memuIds) {
		User user = new User();
		user.set("id", userId).set("name", name).set("login", login).set("userType", userType).update();
		MemuService.me.updateMemuId(userId, memuIds, 2);
		GroupService.me.updateGroupId(userId, groupIds, 2);
	}	

我让User的update成功,MemuService.me.updateMemuId失败

public void updateMemuId(int userId,String memuId,int type){
		MemuRule rule = getMemuRule(userId);
		MemuRule r = new MemuRule();
		if(rule==null){
			r.set("groupId", memuId).set("userId", userId).save();
			return;
		}
		String memuIds = rule.getMemuId();
		if(type==1){
			if(memuIds!=null&&memuIds.length()>2){
				memuIds.replace(","+memuId, "");
			} else {
				memuIds.replace(memuId, "");
			}
			r.set("id", rule.getId()).set("memuId", memuIds).update();
		} else {
			r.set("id", rule.getId()).set("memuId", memuId).update();
		}
	}
public void updateGroupId(int userId,String groupId,int type){
		GroupRule rule = getRule(userId);
		GroupRule r = new GroupRule();
		if(rule==null){
			r.set("groupId", groupId).set("userId", userId).save();
			return;
		}
		String groupIds = rule.getGroupId();
		if(type==1){
			//删除分组
			if(groupIds!=null&&groupIds.length()>2){
				groupIds.replace(","+groupId, "");
			} else {
				groupIds.replace(groupId, "");
			}
			r.set("id", rule.getId()).set("groupId", groupIds).update();
		} else {
			//修改分组
			r.set("id", rule.getId()).set("groupId", groupId).update();
		}
	}

最后user还是更新成功了。

/**
	 * 配置全局拦截器
	 */
	public void configInterceptor(Interceptors me) {
		me.add(new CheckInterceptor());
		me.add(new SessionInViewInterceptor());
		me.add(new TxByMethodRegex("(.*save.*|.*update.*)"));
	   me.add(new TxByMethods("save", "update"));
	 
	   me.add(new TxByActionKeyRegex("/trans.*"));
	   me.add(new TxByActionKeys("/tx/save", "/tx/update"));
	}


评论区

山有鬼兮

2018-08-07 17:02

public void edit(int userId, String name, int login,int userType,String groupIds,String memuIds) {
Db.tx(new IAtom() {
@Override
public boolean run() throws SQLException {
User user = new User();
boolean flag1 = user.set("id", userId).set("name", name).set("login", login).set("userType", userType).update();
boolean flag2 = MemuService.me.updateMemuId(userId, memuIds, 2);
boolean flag3 = GroupService.me.updateGroupId(userId, groupIds, 2);
return flag1&&flag2&&flag3;
}
});
}
修改成这种事务是可以回滚的,声明式事务怎么使用

JFinal

2018-08-07 17:18

配置改成针对业务层:
me.addGlobalServiceInterceptor(new new TxByActionKeyRegex("/trans.*"));

并且注意业务层 aop 的触发需要手动,看一下文档中:
http://www.jfinal.com/doc/4-5

jfinal 3.5 已添加了自动化触发所有层 AOP 的功能,暂时未发布,想提前享用可以考虑加入俱乐部,这个功能俱乐部先用上了

热门反馈

扫码入社