分布式查询和分布式事务
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 时,才允许在分布式事务中执行更新操作。