拦截器的事务问题
lansings 发布于42月前 3答/1393阅

我的原始需求是:按照eova的思想,系统用户表分别放在eova数据库的eova_user和demo数据库的user_info表,我在新增user_info用户时候,添加了拦截器addBefore,用来在新增前首先插入到eova_user表,然后获取eova_user的自增ID后再插入user_info。


实现过程中遇到的问题:现在的问题是,如何使上面的操作保证事务,要么同时插入,要么同时失败。
ID主键和RID由eova_user在维护,user_info从eova_user同步信息,所以顺序是先插入eova_user.

我觉得这个问题的原因是:拦截器如何保证事务



[沙发] 扫地僧
@lansings 就是应为这种方式保证不了事务  我才建议你写action来处理
自定义 可以基于现有的自定义 没那么复杂
参考这个 https://my.oschina.net/u/3630262/blog/3142399
最佳
[地板] 扫地僧
@lansings 这种对事务要求高的可以单独写action来处理  拦截器保证不了事务
[地毯] lansings
@扫地僧  主要是想利用eova的现有的组件,  单独写action是不是相当于完全自定义了。  eova专业版文档里面,关于用户模块这里就是上面我说的这样处理,		// 新增 Eova User
User user = RecordUtil.peelModel(User.class, e, "v_login_id->login_id", "v_login_pwd->login_pwd", "v_rid->rid");
user.set("login_pwd", EncryptUtil.getSM32(user.getStr("login_pwd")));
user.save();

int uid = user.getInt("id");
int rid = user.getInt("rid");
LogKit.info("新增用户成功:" + uid);

ac.record.set("id", uid);
ac.record.set("rid", rid);// 冗余RID 根据业务需要决定时候冗余,反正user和member 是一伙的.。。。

这样处理的话,实际上线运行就会存在一个问题,一个表添加进去了,另一个没添加进去,两个半不一致
提交评论