实现资源管理器

事务中使用的每个资源由资源管理器管理,其作由事务管理器协调。 资源管理器与事务管理器合作,为应用程序提供原子性和隔离保证。 Microsoft SQL Server、持久消息队列、内存中哈希表都是资源管理器的示例。

资源管理器管理持久数据或易失性数据。 资源管理器的持久性(或相反,波动性)是指资源管理器是否支持故障恢复。 如果资源管理器支持故障恢复,则会在阶段 1(准备)期间将数据保存到持久存储,这样,如果资源管理器出现故障,则它可以在恢复后重新登记事务,并根据从事务管理器收到的通知执行适当的作。 一般情况下,易失性资源管理器管理易失性资源(例如内存中的事务性哈希表),持久性资源管理器管理具有持久存储后盾的资源(例如,磁盘为存储后盾的数据库)。

资源若要参与事务,它必须在事务中进行登记。 该 Transaction 类定义一组方法,这些方法的名称以提供此功能的 Enlist 开头。 不同的 登记 方法对应于资源管理器可能具有的不同类型的登记。 具体而言,你应当为易失性资源使用 EnlistVolatile 方法,为持久资源使用 EnlistDurable 方法。 为了简单起见,在根据资源的持久性支持决定是使用 EnlistDurable 还是 EnlistVolatile 方法后,应为资源管理器实现 IEnlistmentNotification 接口,从而将资源登记为参与两阶段提交 (2PC)。 有关 2PC 的更多信息,请参见以单阶段和多阶段提交事务

通过登记,资源管理器可确保在事务提交或中止时能够从事务管理器获取回调。 每个登记都有一个 IEnlistmentNotification 实例。 通常,每个事务都有一个登记,但资源管理器可以选择在同一事务中多次登记。

登记后,资源管理器会对事务的请求做出响应。 持久资源管理器存储了足够的信息,可允许在它所管理的资源上撤消或重做事务的工作。 有多种方法可以做到这一点:保留数据版本或保留更改日志是两种常见技术。

当应用程序提交事务时,事务管理器将启动两阶段提交协议。 事务管理器首先询问每个登记的资源管理器是否准备好提交事务。 资源管理器必须准备好提交,即它自身准备好提交或中止事务。

在准备阶段,持久资源管理器会记录稳定存储中的旧数据和新数据,以便即使系统发生故障,资源管理器也能恢复这些数据。 如果资源管理器可以准备,它会通知事务管理器对是提交还是中止事务进行投票。 如果任何资源管理器报告准备失败,事务管理器会将回滚命令发送到每个资源管理器,并通知应用程序提交失败。

在准备就绪后,资源管理器必须等待,直到它在第 2 阶段中从事务管理器获取提交或中止回调为止。 通常,完整的准备和提交协议过程在瞬间完成。 如果发生系统或通信故障,则提交或中止通知可能无法在几分钟或几小时内送达。 在此期间,资源管理器对事务的结果表示怀疑。 即不知道事务是已提交还是已中止。 尽管资源管理器对事务持怀疑态度,但它通过保持事务锁定来保留数据,从而将这些更改与任何其他事务隔离开来。

当资源管理器失败时,其所有登记的事务都会中止,但失败之前已准备好或提交的事务除外。 当持久资源管理器重新启动时,它会通过检索在准备阶段编写的准备信息重新构建资源的已提交状态,并相应地提交或中止这些事务。

总之,两阶段提交协议和资源管理器组合在一起,使事务具有原子性和持久性。

Transaction 类还提供了 EnlistPromotableSinglePhase 方法来登记可提升的单阶段登记 (PSPE)。 这使持久资源管理器 (RM) 可承载和“拥有”以后可在需要时升级为由 MSDTC 进行管理的事务。 有关此内容的更多信息,请参见使用单阶段提交和可提升的单阶段通知进行优化

本节中

以下主题概述了资源管理器通常遵循的步骤。

在事务中将资源登记为参与者

描述持久资源或易失性资源如何参与事务。

在单阶段和多阶段中提交事务

描述资源管理器如何响应提交通知并准备提交。

执行恢复

描述持久资源管理器如何从故障中恢复。

访问资源的安全信任级别

描述 System.Transactions 的三个信任级别如何限制对公开的资源 System.Transactions 类型的访问。

使用单阶段提交和可提升的单阶段通知进行优化

介绍可用于资源管理器实现的优化做法。