多客户端同时select top 1怎样取到不同的记录?该如何解决

多客户端同时select top 1怎样取到不同的记录?
本帖最后由 itakeblue 于 2013-07-05 10:51:04 编辑
rs.open "select top 1 * from table where working = 0", dbc, 1, 3
rs("working") = 1
rs.update
'对此条记录进行运算,耗时3秒左右
rs("working") = 0
rs.update
rs.close


代码如上,需求是多客户端对同一数据库的记录进行运算,每一条记录只由一个客户端进行操作,所以加了working这个boolean类型的字段,设计在计算时标注working为true,这样其它客户端就跳过此记录。运算结束标注为false。 

但是结果没有如预期这样,运行时有时还是会出现乐观并发检查失败,多个客户端取到了同一条记录,rs.update失败(记录已被另一客户端修改)。

如果改成
rs.open "select top 1 * from table where working = 0", dbc, 1, 2
即悲观锁,同样的代码也会出现取到同一条记录的问题,出错是deadlock死锁。

select top 1 * from table where working = 0 for update
这样加for update也不行。

请问应该有没有其它的办法呢?谢谢。

------解决方案--------------------
’不要喷我,复制粘贴,因为也没用过这个,只是以前浏览到过...
-----------------
LockType 属性
指示编辑过程中记录上的锁定类型。

设置和返回值
设置或返回 LockTypeEnum 值。默认值为 adLockReadOnly。

说明
打开 Recordset 之前先设置 LockType 属性,以指定提供者打开它时使用的锁定类型。读取该属性以返回打开的 Recordset 对象中使用的锁定类型。

提供者可能不支持所有锁定类型。如果提供者不支持请求的 LockType 设置,则替换为另一种锁定类型。要确定 Recordset 对象中实际可用的锁定功能,请将 Supports 方法和 adUpdate 及 adUpdateBatch 一起使用。

如果 CursorLocation 属性设置为 adUseClient,则不支持 adLockPessimistic 设置。如果设置了不支持的值,将不产生错误,而使用所支持的最近似的 LockType。

LockType 属性在 Recordset 关闭时为读/写,而在 Recordset 打开时为只读
多客户端同时select top 1怎样取到不同的记录?该如何解决
------解决方案--------------------
多用户下冲突是不可避免的,需要考虑的就是冲突的处理。
发生冲突就重新来过。
------解决方案--------------------
异常处理不要简单地 resume next。应当随机地延迟一段时间,然后重新尝试查询和 Update。