日期:2014-05-17  浏览次数:21194 次

多个用户同时对同一张表进行查询、更新
有一张表T,是预先写入一些有效数据;每个用户登录系统操作一个交易流程时,都要从T表中获取个有效记录,然后将该记录注销掉,证明该条记录已被使用;
表T
ID stat(状态)

用户要操作一个交易流程
从T表中取一个最小的有效ID
select min(id) from t where stat=1
然后用获取的id做其他数据交易
最后将T表的该条记录注销 update T set stat=0 where id='0'

现在就是有可能多个用户同时操作,是不是会取到同一个MIN(id)
有什么方法可以避免么?



另外我几个帖子都没人回答,都没法结贴啊 杯具啊

------解决方案--------------------
不知道Oracle 里有没有时间戳,处理这种并发最好的方式用时间戳,锁什么的都太强制性了。
------解决方案--------------------
关注时间戳的应用
------解决方案--------------------
select min(id) from t where stat=1 for update!锁住这条数据
------解决方案--------------------
探讨
刚百度下,oracle里有时间戳,
现在先看下oracle里时间戳是怎么一回事;
另外这里要如何应用时间戳呢?

------解决方案--------------------
悲观锁定最简单,不过并发性不是很好,乐观锁定可以考虑用对比时间戳的方式。
------解决方案--------------------
用 乐观锁,


加上 版本号 字段 或者 加上 时间戳



------解决方案--------------------
加一个列,类型timestamp(时间戳);
取出数据,得到时间戳,
更新时,对比时间戳是否相同,如果相同修改.

当你修改数据后,时间戳会自动更新