分布式查询和分布式事务

SQL Server 数据库引擎 允许创建与 OLE DB 数据源(称为链接服务器)的链接。链接到 OLE DB 数据源之后,可以:

在 Transact-SQL 语句中作为表引用 OLE DB 数据源中的行集。

  • 将命令传递给 OLE DB 数据源,并包含结果行集,作为 Transact-SQL 语句中的表。

每个分布式查询都可以引用多个链接服务器,而且可以对每台链接服务器执行更新或读取操作。单个分布式查询可以对某些链接服务器执行读取操作,并且对其他链接服务器执行更新操作。通常情况下,每当可能在某个事务中更新多台链接服务器中的数据时,数据库引擎 都要求相应的 OLE DB 访问接口支持分布式事务。因此,链接服务器上所支持的查询类型取决于 OLE DB 访问接口中对事务的支持级别。OLE DB 为事务管理定义了两个可选的接口:

  • ITransactionLocal 支持 OLE DB 数据源中的本地事务。
  • ITransactionJoin 允许访问接口联接包含其他资源管理器的分布式事务。
    所有支持 ITransactionJoin 的访问接口也都支持 ITransactionLocal

如果在连接处于自动提交模式时执行分布式查询,则应用以下规则:

  • 对于不支持 ITransactionLocal 的访问接口,只允许执行读取操作。
  • 对于支持 ITransactionLocal 的访问接口,允许执行所有更新操作。
    数据库引擎 的控制实例会自动调用参与更新操作的每台链接服务器中的 ITransactionLocal 以启动本地事务。如果语句执行成功则提交事务,如果语句执行失败则回滚事务。

如果分布式查询是针对分布式分区视图的,或是在连接为显式事务或隐式事务时执行,则应用以下规则:

  • 对于不支持 ITransactionJoin 的访问接口,只允许执行读取操作。不支持任何事务或只支持 ITransactionLocal 的访问接口不能参与更新操作。
  • 如果 SET XACT_ABORT 设置为 ON,则对于支持 ITransactionJoin 的任何访问接口,允许执行所有的更新操作。数据库引擎 的控制实例会自动调用参与更新操作的每台链接服务器中的 ITransactionJoin,以便在分布式事务中注册该服务器。然后当主控服务器指示提交事务或回滚事务时,Microsoft 分布式事务处理协调器 (MS DTC) 提交事务或回滚事务。
  • 如果 SET XACT_ABORT 设置为 OFF,则链接服务器还必须支持嵌套事务,才能对其执行更新操作。当会话已经有一个现有事务时,如果访问接口支持调用 ITransactionLocal::StartTransaction,则支持嵌套事务。这样,SQL Server 可以回滚分布式查询中的单个语句,而不必回滚整个事务。

上述规则隐含了对不支持嵌套事务的提供程序的以下限制:只有当 XACT_ABORT 选项设置为 ON 时,才允许在分布式事务中执行更新操作。

请参阅

概念

分布式查询

帮助和信息

获取 SQL Server 2005 帮助