`
从此醉
  • 浏览: 1044919 次
  • 性别: Icon_minigender_1
  • 来自: US
社区版块
存档分类
最新评论

43. 复制或保存冲突之保存篇

 
阅读更多

复制或保存冲突是LotusNotes的一大独特问题。这些冲突之所以会产生,就在于Notes数据库最基本的设计之一就是副本独立读写,再通过复制保持数据一致。此外不像关系型数据库优先数据的一致性,读取要被改动的记录时会锁定这些记录,阻止同时有其他写入。Lotus Notes的文档锁定功能直到R6才被引入,并且仍然由于Notes数据库的分布式本质,应用并不广泛。

既然易于出现,我们这要好好地了解它们,以尽量减少这些麻烦。

原因

我们先来看保存冲突,因为它不必有副本就可能产生,比复制冲突更广泛。Lotus Notes帮助文档中对保存冲突的描述略有误导之嫌。

A save conflict occurs when two or moreusers open and edit the same document at the same time on the same server, evenif they're editing different fields.

很多资料提到保存冲突产生的原因时,还会说是因为同时保存同一个文档,就更令人迷惑了。何谓同时?Notes数据库能并行地处理多个保存同一个文档的请求吗?文档在物理存储中总是唯一的,如何同时保存?同时的标准又是什么?时间上相差0.1秒算吗,还是0.1毫秒,0.1微秒?如果还是串行地先后保存,会产生冲突吗?

实际上,要了解这个保存冲突产生的原因,正可以借鉴复制冲突的原因。两个副本中的同一文档都被修改,再被复制的时候,肯定就会产生冲突,这很好理解。保存冲突其实也是同样的道理,某个文档被读取并修改,在这些变化被写回数据库之前,这个文档又被同一用户或其他用户(不必像帮助文档所写,限于两个或以上不同用户的情况,单个用户也可能产生冲突文档)读取,或有或无修改,再保存。这两次保存时间上较晚的一次就会产生冲突。不论这两次从读取到保存的会话的先后顺序如何,只要它们时间上有重叠,冲突的问题就产生了。或者从机制上说,当内存中的文档要被写回磁盘里对应的文档时,如果发现此时后者与前者被读取时的内容不同,也就是后者的最近修改时间不再是前者被读取时的最近修改时间,就意味着这个文档有了两个不同的版本。

冲突产生后,一个版本被选为主文档,其它则成为它的冲突文档。冲突文档会被添加两个域,一个$Conflict表明是冲突文档,另一个与普通响应文档相同的$Ref域记录主文档的全局Id。

情境

在客户端应用中,如果一个表单触发的代码会通过某种间接的方式修改保存当前文档(不是直接地通过NotesUIWorkspace.CurrentDocument的方式,而是比如经由某个视图修改的文档包括当前文档),然后用户再直接修改保存当前文档,就会产生冲突。与此相对的是,即使一个数据库没有选中锁定文档的选项,在客户端中如果有一个用户甲正在编辑某个文档,其他用户在试图编辑同一数据库副本里的该文档时,也会收到Lotus Notes的提示,甲正在编辑该文档,因此只能阅读不能编辑。

在传统的Notes Web应用中,用户如果快速点击提交保存一个文档的按钮,也可能产生该文档的保存冲突。

应对措施

了解了保存冲突产生的原因,就可以在开发中尽量避免。除非在某些特殊场合,在调用文档的保存方法NotesDocument.Save()时,都会使用不创建冲突文档的参数选项。对于产生原因仍然不明的冲突文档,我们也需要有措施应对。可以建立一个选择条件为

SELECT @IsAvailable($Conflict)

的视图,有需要或不定时地检查是否有新的冲突文档。有些人会写一段脚本自动清除这些冲突文档。笔者比较谨慎,会先人工对比一下冲突文档和主文档有什么不同,再看看能不能找到产生的原因,之后再做相应的处理。

可以写一个代理来打开要检查的冲突文档的主文档。

%REM
	Agent agOpenMainDocument
%END REM
Option Public
Option Declare

Sub Initialize
	Dim ws As New NotesUIWorkspace
	Dim doc As NotesDocument
	If Not ws.CurrentView Is Nothing Then 
		'Call this agent from a view
		Set doc=ws.currentView.Documents.Getfirstdocument()
		If doc Is Nothing Then
			MsgBox "Please select a document for which the parent document you want to open."
			Exit Sub 
		End If
	ElseIf Not ws.CurrentDocument Is Nothing Then
		'Call this agent from a document
		Set doc=ws.Currentdocument.Document
	Else
		Exit Sub 
	End if
	Dim id As String
	id=doc.Parentdocumentunid
	If id="" Then
		MsgBox "This document has not a parent document."
		Exit Sub 
	End If
	Dim docParent As NotesDocument
	Set docParent=doc.Parentdatabase.Getdocumentbyunid(id)
	If Not doc Is Nothing Then
		Call ws.Editdocument(False, docParent)
	Else
		MsgBox "Cannot find the parent document with the id contained by the document."
	End If
End Sub

本来简单用OpenDocument@Command和@InheritedDocumentUniqueID函数就可以完成,但是OpenDocument只能在视图下使用,并且要打开的文档须在此视图内。所以只能用LotusScript实现这个代理。在视图下调用时,须先选中要打开其父文档的子文档。对于文档不是响应文档以及它包含的父文档的全局Id无效的情况,都做了相应的提示。此外为了比较主文档和冲突文档,也可以写一段代码检查两者有哪些域的内容不同。

在下一篇文章里,我们会讨论一下另一种冲突文档——复制冲突。看看Lotus Notes是怎样创建和处理它们的,隐秘的域级别的冲突检查,以及一点理论上的探讨。
分享到:
评论

相关推荐

    父文档变为复制/保存冲突并丢失数据应对方案

    本文档旨在解决在Lotus:registered: Notes:registered:数据库中父文档变为复制/保存冲突并丢失数据的问题,并列举了解决方案还可能的变通方案。

    Solaris系统管理指南:高级管理

    《系统管理指南:高级管理》是介绍OracleSolaris系统管理信息重要内容的一套文档中的组成部分。该指南包含基于SPARC和基于x86的系统的信息。 本书假设您已经安装了OracleSolaris操作系统(operatingsystem,OS)。...

    TortoiseSVN中文手册

    2.2.3. 复制-修改-合并 方案 ........................................... 6 2.2.4. Subversion 怎么做? ........................................... 8 2.3. Subversion 实战 ....................................

    TortoiseSVN和TortoiseMerge的中文帮助文档(chm格式)

    一次移动或复制多个文件 B.2. 强制用户写日志 B.2.1. 服务器端的钩子脚本(Hook-script) B.2.2. 工程(Project)属性 B.3. 从版本库里更新选定的文件到本地 B.4. Roll back (Undo) revisions in the repository B.4.1....

    NOTES FAQ总汇

     A:"复制与保存冲突"是由于同时有两个或两个以上用户对同一文档进行修改,或者是多个用户对同一文档的不同副本进行修改,复制时就会造成复制冲突。对于公用数据库,可以通过把视图作为"共享首次使用为私有的"来避免...

    SVN操作手册中文版网页格式

    一次移动或复制多个文件 B.2. 强制用户写日志 B.2.1. 服务器端的钩子脚本(Hook-script) B.2.2. 工程(Project)属性 B.3. 从版本库里更新选定的文件到本地 B.4. Roll back (Undo) revisions in the repository ...

    subversion-TortoiseSVN-使用手册(CHM+HTML,中英完整版)

    一次移动或复制多个文件 B.2. 强制用户写日志 B.2.1. 服务器端的钩子脚本(Hook-script) B.2.2. 工程(Project)属性 B.3. 从版本库里更新选定的文件到本地 B.4. 回滚版本库里的版本 B.4.1. 使用版本日志对话框 B....

    新编Pro.ENGINEER野火版3.0入门与提高.pdf

    2.将图元裁剪到其他图元或几何 3.在选取点分割图元 2.3.5删除图元 2.3.6移动和修改图元 1. 直线 2. 圆 2.4 草绘中的几何约束 2.4.1 约束的种类 2.4.2创建与删除约束 1.创建约束 2.删除约束 2.4.3解决约束冲突 2.5 草...

    TortoiseSVN基本使用简介

    4.2复制-修改-合并模型 2 5.访问方式 2 5.1直接通过IE访问 2 5.2通过TortoiseSVN的版本库浏览器访问 2 二.SVN基本操作 4 1.检出(checkout) 4 2.更新(update) 5 3.增加(add) 7 4.删除(delete) 8 5.重命名(rename) 9 ...

    pgcat:增强的PostgreSQL逻辑复制

    以便您可以进行双向复制,例如在两个数据中心之间复制数据表名映射可选的lww(最后作者获胜)冲突解决将复制进度保存在表中,以便在订户故障转移时将其记录下来,它将保留进度。 相反,pg的内置逻辑复制将进度保存在...

    iSee视频监控 v5.2

    本系统软件属于我公司专有产品,未经同意,请勿复制,否则影响机 器稳定概不负责,并将通过有关法律渠道追究盗版责任。 功能特点(H.264压缩) 压缩方式:H.264/MPEG 4; 显示分辨率:1024_768、1280_...

    MSDEV.EXE-应用程序错误解决办法.

    启动 @ @ OpenFile@@ @ 对话框中使用键盘快捷方式键 VisualC++ 中或从 文件 菜单导致以下错误: 0x5003eaed 上 DEVSHL.DLL 中访问冲突 (0xC0000005)。 DevShl.Dll 引用 0x0000000 上内存。 无法读取内存。 当您从...

    文字复制粘贴工具

    4、程序托盘图标可以设置快捷键,加载动画,截图识别后自动翻译、截图文件保存位置。 5、文本发送功能使用如下: ①点击文本需要发送的文本框,例如word、记事本、网页的文本框等。 ②点击发送按钮,可以将软件内...

    Delphi仿QQ截屏功能.rar

    定义区域截图时用到的变量,所选区域已截取并复制到了剪贴板!可在其它程序中粘贴!提示:请右键单击图标设置截图热键!不要设置成系统已注册的热键以免冲突。默认全屏截图:Ctrl S,区域截图:Ctrl Q。  //创建...

    百度编辑器Mini完整版 1.2.2.zip

    支持复制图片、截屏图片的粘贴 添加自动保存插件,支持草稿箱功能 支持拖放图片上传并插入 优化了对IE11的支持 支持asp后台 问题修复 修复表情本地化出错问题 修复jquery的$变量冲突问题 修复多编辑器,弹层...

    天若OCR文字识别工具 v1.3.0 开源桌面OCR软件本地版.rar

    天若OCR文字识别工具是一款轻量级最全桌面OCR软件,有些图片或视频中的信息想复制下来,这就要求我们要将这些图片或视频上的的信息截图后转换成可以编辑的文字,解决这个问题有些人知道用专业的OCR识别软件,而对于...

    SVN培训教程.pptx

    目 录 为什么需要使用配置管理软件 SVN相关的基本概念 TSVN的使用流程及图标说明 TSVN基本功能的介绍 常见问题 SVN培训教程全文共43页,当前为第1页。 使用配置管理的理由 及时了解团队中其他成员的进度。 轻松比较...

    MaxDOS_71PXE_G115.rar

    限台客户端,增加方案功能,当首次设置完毕后,方案将自动被保存,下次使用无需再次设置. MAXDOS客户端: 增加新的引导器,主要用于解决某些特殊的主板,或者某些特殊的芯片组引导问题, 特别是针对笔记本无法引导的问题,...

    java面试题

    76.4. 在weblogic管理制台中对一个应用域(或者说是一个网站,Domain)进行jms及ejb或连接池等相关信息进行配置后,实际保存在什么文件中? 86 76.5. 在weblogic中发布ejb需涉及到哪些配置文件 87 76.6. 如何在weblogic中...

Global site tag (gtag.js) - Google Analytics