Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > 综合其它

关于同步冲突

时 间:2008-07-03 08:28:02
作 者:UMVsoft整理   ID:43  城市:江阴
摘 要:关于同步冲突
正 文:

当在两个或多个副本 (副本:属于一个副本集并且可与该集合中其他副本同步的一个数据库副本。在一个副本中对复制的表的数据所做的更改会发送并应用到其他副本。)中都对数据进行更改时,就可能发生冲突。

Microsoft Access 不同版本间的冲突行为差异

在 Access 95 和 97 中存在同步 (同步:通过交换每个成员中所有已更新的记录和对象,来更新一个副本集的两个成员的过程。当每个副本集内的更改都相互应用于另一个副本集时,两个副本集成员就实现了同步。)冲突和同步错误。当两个用户在副本集 (副本集:共享相同的数据库设计和唯一副本集标识符的“设计母版”和所有副本。)内两个不同的数据库中更新相同的记录时,就会发生同步冲突。同步这两个数据库就会解决这种冲突,但记录中的两种更改只能有一种应用到这两个数据库中。当对副本集内某个数据库中的数据进行更改后,如果因违反参照完整性 (参照完整性:输入或删除记录时,为维持表之间已定义的关系而必须遵循的规则。)或其他限制条件而无法应用于副本集内另一个数据库时,则发生同步错误。

在 Access 2000 及更高版本中,引起同步冲突和同步错误的事件都被笼统地认为是同步冲突。有一种单一机制可用于记录并解决冲突,使处理过程更容易执行。无论何时发生冲突,获胜的更改将被选择并应用于所有的副本中,而落败的更改将在所有副本中作为冲突记录下来。“冲突浏览器”(Access 的默认工具)用于协调和解决同步冲突。

Access 不同版本间的行与列级别冲突解决比较

在 Microsoft Access 95 和 97 中,冲突是在行级别决定的。只要在两个独立的副本中更改相同的记录(即使在每个副本中更改的字段不同)就会发生冲突。例如,在一个副本中更改某位客户的电话号码,而在其他副本中更改同一客户的邮政编码,这种情况就会引起冲突 (冲突:如果两个副本集成员的同一条记录中数据有所不同,就会发生冲突。冲突发生时,会选择获胜的更改,并将其应用到所有副本中,失败的更改则会在所有副本中记录为冲突。)。

在 Access 2000 及更高版本中,冲突是在列级别决定的。只有更改相同的列(也称为字段)时,两个不同副本中对同一记录的更改才会导致同步 (同步:通过交换每个成员中所有已更新的记录和对象,来更新一个副本集的两个成员的过程。当每个副本集内的更改都相互应用于另一个副本集时,两个副本集成员就实现了同步。)冲突。所以,在前面的例子中,由于两个用户更改的是不同的字段,所以不再会造成冲突。

当数据库设置为可同步复制时,默认设置为列级别冲突解决。若要为表指定行级别冲突解决,则在将表设置为可同步复制之前,必须先设置行级别冲突解决。

在将数据库或单个表设置为可同步复制之前,可以对其设置冲突跟踪。创建副本之后,就不能更改该设置了。但可以将单个表的值更改为行级别跟踪。

 注释   使用 Jet 和同步复制对象 (JRO) (JRO:一个由自动化界面组成的集合,可用来执行 Microsoft Jet 数据库所特有的操作。使用 JRO,可以压缩数据库,刷新缓冲区中的数据,以及创建和维护复制的数据库。) 只能为数据库指定默认跟踪,而无法为单个表指定默认跟踪。当将数据库设置为可同步复制时,可以使用 JRO MakeReplicable 方法将 ColumnLevelTracking 属性设置为 True 或 False。

同步冲突的类型

同时更新冲突
当两个副本同时更新同一记录时,将发生同时更新冲突。落败的记录将记录在冲突表中。

唯一键冲突
在出现下列情况之一时,将发生唯一键冲突:

在作为主键 (主键:具有唯一标识表中每条记录的值的一个或多个域(列)。主键不允许为 Null,并且必须始终具有唯一索引。主键用来将表与其他表中的外键相关联。)的字段或具有唯一索引 (唯一索引:通过将字段的索引属性设为有(无重复)而定义的索引。唯一索引不允许字段中有重复的项。将字段设为主键会自动将字段定义成唯一的。)的字段中,两个副本都用同样的值输入了新记录。
“设计母版” (设计母版:副本集内唯一可在其中对数据库结构进行更改(更改能传至其他副本)的成员。)创建唯一索引,一个副本可同时添加两个或多个键值相同的记录。当构架更改到达第一个具有重复键记录的副本时,第一个重复键的记录将保存在基表中。后续的记录将被标记为删除,并且写入冲突表中。
表级别有效性冲突
当输入的数据违反表级别有效性规则 (有效性规则:一种属性,用于定义表中字段或记录或者窗体上控件的有效输入值。当违反该规则时,Access 会显示在有效性文本中指定的消息。)时,就发生表级别有效性冲突。有效性规则限制表中允许输入的数据值或数据类型。如果没有确定现有数据是否违反表级别有效性规则就向“设计母版”中添加该规则,则在使副本集 (副本集:共享相同的数据库设计和唯一副本集标识符的“设计母版”和所有副本。)内其他数据库的设计更改同步 (同步:通过交换每个成员中所有已更新的记录和对象,来更新一个副本集的两个成员的过程。当每个副本集内的更改都相互应用于另一个副本集时,两个副本集成员就实现了同步。)时就可能会发生冲突。在这种情况下,会删除记录,并将其记录在冲突表中。

更新参照完整性冲突
当在一个副本中更新主键,而在其他副本上添加新的引用原始主键值的子记录时,将发生更新参照完整性 (参照完整性:输入或删除记录时,为维持表之间已定义的关系而必须遵循的规则。)冲突。在同步期间,新的子记录被删除并记录到冲突表中。为在同步期间减少这些类型错误的数量,可以将 s_GUID 字段用作部分或全部复制表中的主键。

删除参照完整性冲突
当在一个副本中删除某个主键记录,而在第二个副本中添加了新的引用已删除主键的子记录时,将发生删除参照完整性冲突。在对两个副本进行同步时,新的子记录就会被标记为删除,并添加到冲突表中。

锁定冲突
如果因为其他用户锁定了表而在同步期间无法应用记录,则发生锁定冲突。Microsoft Access 将多次尝试对记录进行更新,但如果失败,同步就会终止,整个事务处理将返回其原始状态。这时会返回错误消息,但不记录冲突。

外键违反冲突
当存在无效的主键记录时,将发生外键 (外键:引用其他表中的主键字段(一个或多个)的一个或多个表字段(列)。外键用于表明表之间的关系。)违反冲突。这种冲突可能是其他类型的冲突所引起的。

区分大小写冲突和排序次序冲突
如果数据库之间存在语言排序次序或排序是否区分大小写的差异,则在跨越多种数据库类型(例如 Access 和 Microsoft SQL Server 数据库)的副本集中发生冲突的次数就会增加。这是因为某个数据库中的唯一键值对于使用不同排序方式的其他数据库可能不是唯一的。这个问题可能会影响编入索引的文本数据和元数据,但不影响没有编入索引的文本数据。按不同的排序方式创建副本时要特别注意,必须确保元数据和已编入索引的文本对于两种排序方法而言都是唯一的。

部分副本中的冲突
部分副本 (部分副本:一个仅包含完全副本中记录的一个子集的数据库。使用部分副本,可以设置筛选和确定关系,以确定完全副本中记录哪个记录子集出现在数据库中。)接收与部分副本中所有的行(包括在同步期间添加到部分副本中的行)相关的冲突。

解决冲突

如果在一个或多个副本中更改了复制数据库中相同的字段,则当将某个副本与副本集 (副本集:共享相同的数据库设计和唯一副本集标识符的“设计母版”和所有副本。)进行同步 (同步:通过交换每个成员中所有已更新的记录和对象,来更新一个副本集的两个成员的过程。当每个副本集内的更改都相互应用于另一个副本集时,两个副本集成员就实现了同步。)时,将导致冲突。若要解决这些冲突,请打开“冲突浏览器”。向导会列出每一种冲突,用户必须手动确定哪个已更改的记录中包含正确的信息。



Access软件网QQ交流群 (群号:483923997)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助