使用 OPENXML 执行 InsertOrder
  在第一组测试中,订单和订单详细信息从 DataSet 表中以 XML 格式传递到一个 Microsoft SQL Server 2000 存储过程中。存储过程中的 Transact-SQL 代码使用 OPENXML 方法,通过一次数据库往返将相应信息插入到 Order 和 OrderDetails 表中。测试首先运行一个包含 10 个详细信息的订单。

图 1:InsertOrder_OpenXml(Order=1, Details=10)

  注意
  在 DatabaseTxn 方法中,存储过程将操作打包在 BEGIN TRANSACTION 和 COMMIT/ROLLBACK TRANSACTION 语句中。
  在 ManualTxn 方法中,使用 ADO.NET SQLTransaction 对象来控制事务处理。
  在 ManualTxn_COM+_IP 和 ManualTxn_COM+_OP 中,都是使用 ADO.NET SQLTransaction 对象来控制事务处理,而程序集则由 COM+ 分别配置为库和服务器程序包。
  包含 AutomaticTxn 和 AutCompleteTxn 实现的 .NET 程序集使用 COM+ 进行注册。在 AutomaticTxn 中,我们显式提交或中止事务处理,而在 AutoCompleteTxn 中,则由 .NET 程序集来确定提交或中止当前事务处理。

  在 AutomaticTxn_IP 和 AutoCompleteTxn_IP 中,包含程序集的 COM+ 应用程序是一个由库激活的应用程序,所以该应用程序在创建它的客户端进程中运行。 
  在 AutomaticTxn_OP 和 AutoCompleteTxn_OP 中,包含程序集的 COM+ 应用程序是一个由服务器激活的应用程序,所以该应用程序在代理进程 (dllhost.exe) 中运行。 如图 1 所示,DatabaseTxn、ManualTxn 和 ManualTxn_COM+_IP 方法提供了类似的性能,只是 DatabaseTxn 方法的吞吐量比手动事务处理模型略高一些。这是因为 ADO.NET 手动事务处理需要执行额外的数据库往返操作以开始和结束事务处理。
  ManualTxn_COM+_IP 产生的 COM+ 相互操作非常少,因为此方法不使用任何 COM+ 服务,这也是它和 ManualTxn 具有非常类似的行为的原因,在 ManualTxn 中,根本没有涉及到 COM+。
  如果将 ManualTxn 和 ManualTxn_COM+_IP 与 AutomaticTxn_IP 进行比较,您会发现自动事务处理平均要慢约 30%。这是因为使用分布式事务协调器 (DTC) 设置事务处理的成本要比在事务处理中完成所有工作(11 次插入)的成本大。AutomaticTxn_IP 还涉及到一个上下文方法调用,需要进行上下文转换,因而产生了额外的成本。
  AutomaticTxn_IP 提供的性能比 MaualTxn_COM+_OP 和 AutomaticTxn_OP 要好,因为 AutomaticTxn_IP 中的库程序包可以使程序集在调用应用程序进程(本例中是 aspnet_wp.exe)内部运行,从而避免了封送处理。因为无需数据封送,AutomaticTxn_IP 中的总体成本(包括 DTC 成本)要比 ManualTxn_COM+_OP 少,这也是 AutomaticTxn_IP 在性能方面比 ManualTxn_COM+_OP 略胜一筹的原因。
  可以看到,AutoCompleteTxn_IP 和 AutoCompleteTxn_OP AutoComplete 版本分别与 AutomaticTxn_IP 和 AutomaticTxn_OP 版本的运行状况类似。使用 AutoComplete 提交的缺点是,它在方法成功返回并确定进行提交时,由于事务处理要释放服务器资源而延长了时间,因而可能会降低应用程序的性能。另外,当事务处理失败时,它不允许用户在需要时发出用户友好消息。