管理数据并发

WCF RIA Services 支持开放式并发以便确保数据一致性,并且依赖于开发人员提供用于处理在更新数据源时可能会发生的潜在冲突的逻辑。当允许用户更新或删除数据时,应确保在数据记录中盲目更新其值或从记录中删除数据之前,数据源中的数据尚未被另一个进程更改。如果不检查值是否已更改,则可能会无意中覆盖另一个进程设置的值,并使数据处于不一致的状态。开放式并发假定此类冲突很少见,但将从数据源获取的值(并且可能这些值已更改或删除)与该数据源当前具有的值进行比较。如果它们不匹配,则将引发 OptimisticConcurrencyException 并且必须处理。

有关如何指定检查值是否一致的过程,请参见如何启用开放式并发检查。有关如何使用显式事务确保一致性的信息,请参见如何:将显式事务添加到域服务

使用 Concurrency 特性

默认情况下,RIA Services 不为检查数据并发而将整个原始实体随已更改的值传递到数据访问层。RIA Services 而是仅存储和传递回用 RoundtripOriginalAttribute 特性、ConcurrencyCheckAttribute 特性或 TimestampAttribute 特性标记的那些成员。

在使用实体框架时,上述每个特性都可以应用于元数据类中的属性或者应用于元数据类本身。在使用 POCO 定义的数据模型时,它们还可以直接应用于 CLR 类型的属性或类。有关更多信息,请参见如何:添加元数据类。在应用这些特性后,当您生成代码时,将导致相应特性出现在为属性或类生成的客户端代码上。在将某一特性应用于类而不是类中的属性时,等效于将该特性应用于该类的所有成员。ConcurrencyCheckAttributeTimestampAttribute 特性也将导致 RoundtripOriginalAttribute 出现在它们在域服务元数据中已应用到的客户端属性或类上。此实现允许您通过仅指定那些要参与并发检查的成员来优化应用程序的性能。有关更多信息,请参见

Important 注意:
如果 KeyAttribute 应用于某一实体类型的属性,则在生成项目时也将 RoundtripOriginalAttribute 添加到在客户端上生成的相应属性中。因此,在使用“添加新的域服务类”向导从数据库源生成的域服务中,这是充当实体键的属性的默认行为。

在应用 RoundtripOriginalAttribute 时,数据访问层会将在检索数据时记录的数据源中的原始值与数据源中数据的当前值进行比较。如果这些值相同,则表示存储区中的数据尚未更改,并且数据访问层会更新或删除数据。如果更改了数据,则会发生冲突并引发 OptimisticConcurrencyException。与冲突有关的信息存储在不再有当前数据的实体的 EntityConflict 属性中。

如果将 ExcludeAttribute 特性应用到可以从客户端更新或删除的实体中的某一成员,则该成员不可用于开放式并发检查。排除成员时,不为该成员存储正确的原始值,因此更新操作将始终失败。有关更多信息,请参见如何:添加元数据类

处理 OptimisticConcurrencyException

在对象缓存中的数据更改与对象添加到缓存后或在缓存中刷新后数据源中发生的更改相冲突时,整个事务都将回滚。如果发生 OptimisticConcurrencyException,应通过指定是否应解决冲突(通过将数据保存到对象数据 (ClientWins) 或通过使用来自数据源的数据更新对象缓存 (StoreWins))来处理该异常。有关如何执行的指南,请参见保存更改和管理并发