当前位置: 代码迷 >> Lotus >> notes R5 C/S模式 文件锁有关问题 无力!求解
  详细解决方案

notes R5 C/S模式 文件锁有关问题 无力!求解

热度:227   发布时间:2016-05-05 07:22:03.0
notes R5 C/S模式 文件锁问题 无力!!求解
发帖之前我已关注了这个帖子:http://topic.csdn.net/t/20040901/17/3330588.html
情况有些类似,目前我使用的是notes5 C/S模式
功能设计描述:
1、 数据库的ACL中用户默认是“编辑者”。
2、 目前系统代理生成一个文档,很多用户可以在上面进行填写,考虑到复制保存冲突问题,在代码中定义一个资源锁;wrFlag、wrUser,分别记录当前是否在编辑与当前编辑者;

在Sub Postopen(Source As Notesuidocument)事件下,如果doc.wrFlag(0) <> "wr",则对wrFlag和wrUser进行赋值,文档可编辑,在Querysave和Queryclose中对这两个域进行清空。具体如下:
Sub Postopen(Source As Notesuidocument) ‘’’’’文档被打开的时候执行标志域判断,复制的逻辑操作
If doc.wrFlag(0) <> "wr" Then ''''如果文件没被编辑,则当前可编辑
flag="1"
source.editmode=True
'''''当前在访问,将文件挂起,下一个用户打开只读
doc.wrFlag = "wr" ''''读写标志域
doc.wrUser=s.username ''''编辑者
Call source.refresh 
Call doc.Save(True,False) '''保存文档,将wrFlag域保存进去
Else
Msgbox "文档正被"+doc.wrUser(0)+",编辑!"
End If
End Sub


Sub Querysave(Source As Notesuidocument, Continue As Variant) ‘’’’’正常关闭文档,对标志域进行清空
If flag="1" Then
doc.wrFlag="" '''''当前编辑用户离开,清楚挂起状态
doc.wrUser="" ''''清空当前编辑者
Call doc.Save(True,False) '''保存文档,将wrFlag域保存进去
End If
End Sub


Sub Queryclose(Source As Notesuidocument, Continue As Variant) ‘’’’不保存关闭,清空标志域
If flag="1" Then
doc.wrFlag="" '''''当前编辑用户离开,清楚挂起状态
doc.wrUser="" ''''清空当前编辑者
Call doc.Save(True,False) '''保存文档,将wrFlag域保存进去
End If
End Sub


开发设计测试的时候没问题,但是到用户那边使用,就会偶尔出现锁死的情况。
求真相啊!!!!
在线等。


------解决方案--------------------
锁死是因为doc.wrFlag = "wr",然后无论谁都进不去修改文档了,你把wrFlag的值改成当前用户,用是否为空来判断文档是否正在被编辑,这样在发生冲突的时候至少还能有人进去修改文档。

另外,你解锁的机制仍然是基于事件的,如果文档非正常关闭,锁仍旧在的。

冲突文档是不可避免的,增加锁的机制只能减少冲突的发生;在写锁的时候不要将锁写成死锁,这样在发生冲突的时候还可以由人去干涉解锁。
  相关解决方案