NutzCN Logo
问答 如何保证并发情况下唯一性
发布于 2660天前 作者 qq_a930202f 1788 次浏览 复制 上一个帖子 下一个帖子
标签:

类似买票问题。
需要先查出一条数据,再更新其中的字段标识不被查出。并发情况下如何保证这条数据不被多处更新。
在nutz的service中怎么处理比较好?

10 回复
update xxx  set yyy=yyy+1 where id=123

@wendal

select id,used from room where used="No"
* id=123,used="N"

update room set used ="Yes" where id =123

我的场景大概是这样的。担心并发情况下123被多处查出,更新的时候就混乱了

可以通过在包含查找,更新的service函数上加synchronized以达到效果吗?ioc管理的的service有影响吗

加上版本号字段

谢谢,我试试

加版本号的话,伪代码应该是这样的吧?

select id,used,version from room where used="No"
* id=123,used="No",version=0

update room set used ="Yes",version=1 where id =123 and version=0

version=version+1

新版nutz的dao有updateWithVersion

这样?

room  = fetch(cnd); 
room.setUsed("Yes");
room.setVersion(room.getVersion+1);
dao().updateWithVersion(obj);

需要过滤的字段什么意思?

   /**
     * 基于版本的更新,版本不一样无法更新到数据
     * @param obj 需要更新的对象, 必须有version属性
     * @return 若更新成功,大于0, 否则小于0
     */
    int updateWithVersion(Object obj);
    
    /**
     * 基于版本的更新,版本不一样无法更新到数据
     * @param obj 需要更新的对象, 必须有version属性
     * @param fieldFilter 需要过滤的字段设置
     * @return 若更新成功,大于0, 否则小于0
     */
    int updateWithVersion(Object obj, FieldFilter fieldFilter);

@wendal

getEntity(Lang.first(obj).getClass()).getVersionField()
为null

实体的version这样定义不行吗?

	@Column("version")
	@ColDefine(type = ColType.INT)
	private Long version;
room  = fetch(cnd); 
room.setUsed("Yes");
//room.setVersion(room.getVersion+1); 不要动version!!!!
dao().updateWithVersion(root);

	@Column(version=true)
	private Long version;
添加回复
请先登陆
回到顶部