第9章 事务
数据访问技术—— ADO.NET 2.0 第1章: 数据库基础 第 6 章: 类型化DataSet 第 2 章: ADO.NET 2.0概述 第 3 章: 数据源连接 第 4 章: 在连接环境中获取数据 第 5 章: 构建DataSet 第 6 章: 类型化DataSet 第 7 章: 在断开连接的环境中编辑和更新数据 第 8章: 数据的排序、搜索和过滤 第 9 章: 事务 第 10 章: ADO.NET和XML 2
目标 本章学习目标: 了解事务的重要性 掌握启动事务的方法 为事务指定适当的隔离级别 掌握提交或回滚事务的方法 3
第9章 事务 事务的概念 ADO.NET的事务支持 Transaction类 通过使用ADO.NET来执行事务 隔离级别 应用事务的高级技巧 第9章 事务 事务的概念 ADO.NET的事务支持 Transaction类 通过使用ADO.NET来执行事务 隔离级别 应用事务的高级技巧 分布式事务 使用事务的时机 事务与性能 事务与用户确认 小结 实验 习题
事务的概念 从账户A上扣除人民币100元 在账户B上添加人民币100元 假设要把人民币100元从账户A转到账户B。这个操作包含以下两个步骤: 9.1 事务的概念 假设要把人民币100元从账户A转到账户B。这个操作包含以下两个步骤: 从账户A上扣除人民币100元 在账户B上添加人民币100元
事务的属性 原子性。事务是一个原子工作单元,即一组不可分割的操作。 一致性。事务可保持数据一致性。 隔离性。事务是一个独立的单元。 9.1.1 事务的属性 事务的特点主要由ACID属性体现。ACID分别代表了原子性(Atomic)、一致性(Consistent)、隔离性(Isolated)和可持续性(Durable)。下面简要介绍这四种属性。 原子性。事务是一个原子工作单元,即一组不可分割的操作。 一致性。事务可保持数据一致性。 隔离性。事务是一个独立的单元。 可持续性。对于一系列操作而言,事务还是一个恢复单元。
数据库事务 可以使用SQL语句来管理数据层上的事务。 9.1.2 数据库事务 事务语句 描述 BEGIN TRANSACTION COMMIT TRANSACTION 标记一个成功事务的结束,提交BEGIN TRANSACTION语句之后所做的所有更改 SAVE TRANSACTION 允许在事务中设置一个标记,以标明回滚的位置 ROLLBACK TRANSACTION 标记一个不成功事务的结束,取消在执行BEGIN TRANSACTION语句后所发生的所有更改,并将事务回滚到该事务的起始处
1 2 3 4 显式本地事务 创建一个存储过程。 在该存储过程中,启动一个事务。 在该事务内执行数据更新操作。 9.1.2 数据库事务 创建一个存储过程。 1 在该存储过程中,启动一个事务。 2 在该事务内执行数据更新操作。 3 如果所有更新操作成功,则提交该事务。 4 代码示例 8
本地事务和分布式事务的定义 本地事务和分布式事务的定义如下。 本地事务。本地事务应用于单个数据源,例如一个数据库或一个消息队列。 9.1.2 数据库事务 本地事务和分布式事务的定义如下。 本地事务。本地事务应用于单个数据源,例如一个数据库或一个消息队列。 分布式事务。一个分布式事务会跨越多个数据源。 9
事务可分为手动事务和自动事务 事务还可以分为手动事务和自动事务。 9.1.2 数据库事务 事务还可以分为手动事务和自动事务。 手动事务模型允许使用显式指令启动和结束事务以控制事务边界,并允许从活动事务(支持嵌套事务)内启动新事务。 自动事务模型隐式封装一条语句或大量语句。换言之,附加语句只需自动加入当前运行的事务。 10
第9章 事务 事务的概念 ADO.NET的事务支持 Transaction类 通过使用ADO.NET来执行事务 隔离级别 应用事务的高级技巧 第9章 事务 事务的概念 ADO.NET的事务支持 Transaction类 通过使用ADO.NET来执行事务 隔离级别 应用事务的高级技巧 分布式事务 使用事务的时机 事务与性能 事务与用户确认 小结 实验 习题 11
1 2 3 4 5 ADO.NET的事务支持 在连接模型里,事务的典型操作步骤如下。 打开一个数据库连接。 启动一个事务。 通过Command对象激活该连接上的查询。 3 提交或回滚事务。 4 断开连接。 5 12
ADO.NET的事务支持(续) 在连接模型下的事务如图所示 9.2 ADO.NET的事务支持 ADO.NET Transaction 对象 Connection Command 数据库 13
1 2 3 4 5 操作步骤 在断开连接的模型下 ,操作的步骤一般如下。 打开一个数据库连接。 从一个DataSet对象中获取必要的数据。 9.2 ADO.NET的事务支持 在断开连接的模型下 ,操作的步骤一般如下。 打开一个数据库连接。 1 从一个DataSet对象中获取必要的数据。 2 断开数据库连接。 3 操作DataSet对象中的数据。 4 重新打开一个数据库连接。 5 14
6 7 8 9 操作步骤 (续) 启动一个事务。 将事务对象分配给DataAdapter上的相关命令。 9.2 ADO.NET的事务支持 启动一个事务。 6 将事务对象分配给DataAdapter上的相关命令。 7 用DataSet内所做的改变更新数据库。 8 断开连接。 9 15
断开连接模型下的事务 断开连接模型下的事务如图所示。 9.2 ADO.NET的事务支持 16 ADO.NET Transaction 对象 Connection 数据库 DataSet SelectCommand UpdateCommand InsertCommand DeleteCommand DataAdapter 16
第9章 事务 事务的概念 ADO.NET的事务支持 Transaction类 通过使用ADO.NET来执行事务 隔离级别 应用事务的高级技巧 第9章 事务 事务的概念 ADO.NET的事务支持 Transaction类 通过使用ADO.NET来执行事务 隔离级别 应用事务的高级技巧 分布式事务 使用事务的时机 事务与性能 事务与用户确认 小结 实验 习题 17
Transaction类 .NET Framework 2.0 中可用的Transaction类及其描述如下表所示。 System.Data.SqlClient.SqlTransaction SQL Server .NET Framework数据提供程序Transaction类 System.Data.OleDbClient.OleDbTransaction OLE DB .NET Framework数据提供程序Transaction类 System.Data.Odbc.OdbcTransaction ODBC .NET Framework数据提供程序Transaction类 System.Data.OracleClient.OracleTransaction Oracle .NET Framework 数据提供程序Transaction类 18
Transaction类(续) Transaction类有如下两个最常用的方法。 Commit():把一个事务标记为成功。 Rollback():把一个事务标记为失败。 19
第9章 事务 事务的概念 ADO.NET的事务支持 Transaction类 通过使用ADO.NET来执行事务 隔离级别 应用事务的高级技巧 第9章 事务 事务的概念 ADO.NET的事务支持 Transaction类 通过使用ADO.NET来执行事务 隔离级别 应用事务的高级技巧 分布式事务 使用事务的时机 事务与性能 事务与用户确认 小结 实验 习题 20
1 2 3 4 5 通过使用ADO.NET来执行事务 在程序中使用ADO.NET来执行一个基本事务是非常简单的,其步骤如下。 用Connection对象的Open()方法打开一个数据库连接。 1 用Connection对象的BeginTransaction()方法启动一个事务。 2 将Command对象的Transaction属性设置为步骤2所提到的Transaction对象。 3 使用Command对象来执行SQL命令。 4 用Transaction对象的Commit()或Rollback()方法来提交或回滚事务。 5 21
6 7 8 通过使用ADO.NET来执行事务 (续) 释放Command对象。 释放Transaction对象 。 关闭数据库连接。 22
实现事务 9.4 通过使用ADO.NET来执行事务 数据库的架构如图所示。 23
实现事务(续) 9.4 通过使用ADO.NET来执行事务 在开始之前,先用图中所示的行来填充客户表。 24
实现事务(续) 9.4 通过使用ADO.NET来执行事务 为产品表添加行,如图所示。 代码示例C# 代码示例VB 25
第9章 事务 事务的概念 ADO.NET的事务支持 Transaction类 通过使用ADO.NET来执行事务 隔离级别 应用事务的高级技巧 第9章 事务 事务的概念 ADO.NET的事务支持 Transaction类 通过使用ADO.NET来执行事务 隔离级别 应用事务的高级技巧 分布式事务 使用事务的时机 事务与性能 事务与用户确认 小结 实验 习题 26
隔离级别 9.5 隔离级别 隔离级别的概念 并发错误 ADO.NET中的隔离级别 改变隔离级别 27
隔离级别的概念 隔离级别是指事务外部所发生的更改对事务内部的可见程度的一种度量。它决定了您的事务对其他事务所做更改的敏感程度。 9.5.1 隔离级别的概念 隔离级别是指事务外部所发生的更改对事务内部的可见程度的一种度量。它决定了您的事务对其他事务所做更改的敏感程度。 28
并发错误 若干事务同时访问同一数据时可能发生并发错误。 9.5.2 并发错误 并发错误类型 描述 脏读 事务A读取一行,而该行已被事务B更新但尚未提交。如果事务A看到了已更新的数据,而事务B随后又进行了回滚,则事务A所看到的是从未真正存在过的数据 不可重复读 事务A读取了已提交的数据。然后,事务B更新并提交该数据。如果事务A再次尝试读取该数据,则同一行事务A将获得不同的值 幻读 事务A读取与搜索条件相匹配的若干行。事务B以插入、更新或删除行等方式来修改事务A的结果集,然后再提交。如果事务B重复该读取操作,则将获得不同的行集。采用这种方式所添加的行叫做幻影行 29
ADO.NET中的隔离级别 可以赋给多种类型的事务对象的IsolationLevel 属性值 及其描述如下表所示。 隔离级别枚举值 描述 使用场景 ReadUncommitted 该隔离级别在并发事务之间提供最少的保护。 可能发生脏读、不可重复读和幻读。当希望处理匹配某些条件的所有数据,而不考虑其是否已提交时,适用此类型的隔离级别 通常,当应用程序对所查询的数据不要求确定的准确性时,以及优先顺序为性能高于准确性时,可使用此隔离级别。如果性能是应用程序设计中的首要标准,则应首选此隔离级别,而不是其他,但是请务必了解其代价是数据可能欠准。请注意,在进行非锁定 SELECT 查询时,稍后描述的 Snapshot 隔离级别提供了比 ReadUncommitted 更好的替代方法。即使未获得最新的数据,至少仍可获得已提交的数据。ReadUncommitted 的较好也较实用的用法是由管理员用于数据监视。建议保守使用此隔离级别 30
ADO.NET中的隔离级别 (续表 ) 9.5.3 ADO.NET中的隔离级别 隔离级别枚举值 描述 使用场景 ReadCommitted 事务只能看到已提交的数据。事务看不到未提交的数据更新 该隔离级别可阻止脏读。仍可能发生不可重复读和幻读。当您希望处理匹配某些条件的所有已提交数据时,则此类型的隔离级别适用 当您需要长时间运行的查询保持事务性一致性,而不关心是否会得到不可重复的读取时,可使用此隔离级别。同时,这也是两种 SqlTransaction 的默认隔离级别 RepeatableRead 事务会锁定其在查询中读取的所有行,因此将阻止其他事务更新该数据直至该事务终止为止 该隔离级别可阻止脏读和不可重复读。仍可能发生幻读。当希望读取的记录保留相同的值以供将来读取时,适用此类型的隔离级别 此类型的事务确保在事务完成之前,对数据的所有其他修改停止。因此,此类型的事务非常适合于以较差的并发性能为代价而获得事务内一致性的情形。但是,仍然可能发生幻读,并且这在技术上属于悲观并发性,在断开连接场合下此情况应尽可能避免 31
ADO.NET中的 隔离级别(续) (续表 ) 9.5.3 ADO.NET中的隔离级别 隔离级别枚举值 描述 使用场景 Serializable 事务彼此完全隔离。该隔离级别经常通过锁定大量行或整个表实现。 该隔离级别可阻止脏读、不可重复读和幻读。当希望在谓词中处理的所有数据在完成处理之前完全保持不变时,适用此类型的隔离级别 通常,当应用程序处理多组行,并且需要在一次事务中所进行的所有操作之间保持绝对一致性时,此隔离级别非常有用。这确保了最干净的数据,但是将导致大多数数据库锁定,并且只有在需要悲观锁定以及对数据的绝对控制的情况下才必须使用。在高度并发系统中,这显然是以性能为代价的 Snapshot 此类型的隔离级别存储在一个应用程序进行修改时另一个应用程序可读取的数据的版本,从而降低了对行加锁的可能性。换言之,如果事务 A 正在修改数据,则事务 B 将无法看到所做的更改。重要的是事务 B 不会锁定,并在事务 A 开始之前读取数据的快照 因此,对于长时间运行的查询中需要数据一致性,但是不计划修改数据的应用程序,此类型的隔离级别很理想。这可用于乐观并发性模型。在 SQL Server 2005 中,在可使用 Snapshot 隔离级别之前,必须先在数据库级别启用该隔离。这可使用下面的命令完成: ALTER DATABASE 数据库 SET ALLOW_SNAPSHOT_ISOLATION ON Unspecified 指定一个与正在使用的隔离级别不同的隔离级别,但其级别尚未确定 32
改变隔离级别 9.5.4 改变隔离级别 将SQL Server数据库的默认隔离级别ReadCommitted改为ReadUncommitted 的步骤如下。 1 打开一个Test数据库连接,并启动一个事务。 2 打开另一个数据库连接,并启动另一个事务。 3 从第一个事务里,向客户表插入一行。 33
改变隔离级别(续) 9.5.4 改变隔离级别 在不提交第一个事务的情况下,在隔离级别为ReadUncommitted的第二个事务里获取一行。结果显示在控制台上。 4 回滚第一个事务,并且再次从第二个事务里获取新插入(现在已回滚)的客户,可以看出相同的查询得到不同的结果,因此证明ReadUncommitted是不可靠的事务隔离级别。 5 代码示例C# 代码示例VB 34
改变隔离级别的多媒体演示 多媒体演示
第9章 事务 事务的概念 ADO.NET的事务支持 Transaction类 通过使用ADO.NET来执行事务 隔离级别 应用事务的高级技巧 第9章 事务 事务的概念 ADO.NET的事务支持 Transaction类 通过使用ADO.NET来执行事务 隔离级别 应用事务的高级技巧 分布式事务 使用事务的时机 事务与性能 事务与用户确认 小结 实验 习题 36
应用事务的高级技巧 9.6 应用事务的高级技巧 保存点 嵌套事务 利用DataSet和DataAdapter使用事务 37
保存点 9.6.1 保存点 保存点是同书签类似的标签,它可以标记事务流程中的某一点,然后回滚到这一点,这样就不必回滚整个事务了。可以用Transaction对象的Save()方法来完成这项任务。 代码示例C# 代码示例VB 38
保存点的多媒体演示 多媒体演示
嵌套事务 9.6.2 嵌套事务 如上一节所述,保存点允许将事务安排为可单独回滚的一系列的操作。另一方面,嵌套可使事务安排为这些操作的层次结构。在嵌套事务的情况下,一个事务可包含一个或多个其他事务。若要启动这样的嵌套事务,需要使用事务对象的 Begin ()方法。 40
利用DataSet和DataAdapter使用事务 利用DataSet和DataAdapter使用事务,第一种逻辑方法是将事务与 DataAdapter 和 DataSet 一起使用,并将4条相关联的命令包装在一个事务中 。 代码示例C# 代码示例VB ADO.NET 2.0 在DataAdapter对象中引入一个新属性,名为 AcceptChangesDuringUpdate。将 AcceptChangesDuringUpdate 属性值设置为 true 将指示数据适配器对各行执行命令时不应更改行状态。 代码示例C# 代码示例VB 41
使用事务的多媒体演示 多媒体演示
第9章 事务 事务的概念 ADO.NET的事务支持 Transaction类 通过使用ADO.NET来执行事务 隔离级别 应用事务的高级技巧 第9章 事务 事务的概念 ADO.NET的事务支持 Transaction类 通过使用ADO.NET来执行事务 隔离级别 应用事务的高级技巧 分布式事务 使用事务的时机 事务与性能 事务与用户确认 小结 实验 习题 43
分布式事务 典型的分布式事务流如下。 应用程序从 MSDTC 请求一个事务并启动事务。此应用程序通常称为发起方。 9.7 分布式事务 典型的分布式事务流如下。 应用程序从 MSDTC 请求一个事务并启动事务。此应用程序通常称为发起方。 然后, 应用程序作为同一事务的一部分请求 RM 执行其工作(这实际是可配置的),然后 RM 作为同一事务的一部分向事务管理器注册。这通常称为在事务中登记。 如果一切正常,则应用程序提交事务。 如果出现失败,则任何步骤都可发出回滚。 无论哪种情况,事务协调器将协调所有 RM 以确保它们全部成功并执行所请求的工作,或者它们全部回滚其工作。 44
分布式事务(续) 二阶段提交 实现分布式事务 管理分布式事务的过程 指示分布式事务是否成功 通过使用ADO.NET来管理分布式事务 9.7 分布式事务 二阶段提交 实现分布式事务 管理分布式事务的过程 指示分布式事务是否成功 通过使用ADO.NET来管理分布式事务 45
二阶段提交 9.7.1 二阶段提交 在分布式事务的场合,各个 RM 需要实现可靠的提交协议,其中最常见的实现称为二阶段提交。 46
实现分布式事务 9.7.2 实现分布式事务 分布式事务的第一部分所产生的脏读如图所示。 47
实现分布式事务 (续) 9.7.2 实现分布式事务 在第二个 RM 出现之前, “事务列表”不会显示任何事务 。 48
实现分布式事务 (续) 9.7.2 实现分布式事务 “事务列表”只有在第二个 RM 出现之前才会显示事务。 代码示例C# 代码示例VB 49
管理分布式事务的过程 事务作用域可根据以下规则, 在必要时自动将本地事务升级为分布式事务。 9.7.3 管理分布式事务的过程 当创建TransactionScope 对象时,最初会创建一个本地的、轻量事务。 如果在事务作用域中所打开的第一个连接是连接到SQL Server 2005 数据库的,则该连接会登记在本地事务中。 如果在事务作用域中所打开的第一个连接是连接到除了 SQL Server 2005 数据库以外的任何其他数据库,则事务作用域会立即将本地事务升级为分布式事务。 50
指示分布式事务是否成功 当释放TransactionScope时,事务要么提交, 要么回滚,取决于是否调用了Complete()方法。 9.7.4 指示分布式事务是否成功 当释放TransactionScope时,事务要么提交, 要么回滚,取决于是否调用了Complete()方法。 如果在释放TransactionScope 对象之前已对其调用Complete()方法,则事务管理器将提交该事务。 如果在释放TransactionScope 对象之前未对其调用Complete()方法,则事务管理器将回滚该事务。 51
TransactionScopeOption 值 通过使用ADO.NET来管理分布式事务 9.7.5 通过使用ADO.NET来管理分布式事务 TransactionScopeOption中可用的值及其描述如下表所示。 TransactionScopeOption 值 描述 Required 如果环境事务已存在,则事务作用域使用该环境事务。 否则,事务作用域将创建一个新事务。此为默认值 RequiresNew 该事务作用域总会创建一个新事务 Suppress 事务作用域取消了环境事务上下文。 事务作用域内的所有操作都在无环境事务上下文的情况下被执行 52
1 2 3 通过使用ADO.NET来管理分布式事务 (续) 在分布式事务中, 更新多个数据库的步骤如下。 添加一个指向 System.Transactions程序集的引用 。 2 导入System.Transactions命名空间 。 如果要指定事务的嵌套行为,则应声明一个TransactionScopeOption 变量,并赋给它一个合适的值。 3 53
4 5 6 7 通过使用ADO.NET来管理分布式事务 (续) 如果要指定事务的隔离级别和超时时限,则应创建一个TransactionOptions 对象,并设置其IsolationLevel 和TimeOut 属性。 4 5 用using 语句创建一个新的TransactionScope 对象。 6 在using 语句块中,打开通往每个需要更新的数据库的连接,并按照应用程序的需要来执行更新操作 7 关闭using 语句块来释放TransactionScope 对象。 代码示例C# 代码示例VB 54
第9章 事务 事务的概念 ADO.NET的事务支持 Transaction类 通过使用ADO.NET来执行事务 隔离级别 应用事务的高级技巧 第9章 事务 事务的概念 ADO.NET的事务支持 Transaction类 通过使用ADO.NET来执行事务 隔离级别 应用事务的高级技巧 分布式事务 使用事务的时机 事务与性能 事务与用户确认 小结 实验 习题 55
使用事务的时机 底层 RDBMS、ADO.NET 或 MSDTC 提供了事务性功能 。 9.8 使用事务的时机 如果事务跨多个支持事务的 RM(可能包括多个数据库、MSMQ 等),则 MSDTC 事务将是唯一的选择。 56
第9章 事务 事务的概念 ADO.NET的事务支持 Transaction类 通过使用ADO.NET来执行事务 隔离级别 应用事务的高级技巧 第9章 事务 事务的概念 ADO.NET的事务支持 Transaction类 通过使用ADO.NET来执行事务 隔离级别 应用事务的高级技巧 分布式事务 使用事务的时机 事务与性能 事务与用户确认 小结 实验 习题 57
事务与性能 在实现事务时,为了得到可接受的结果,可遵循以下准则。 使事务尽可能的短。 9.9 事务与性能 在实现事务时,为了得到可接受的结果,可遵循以下准则。 使事务尽可能的短。 避免在事务中途以用SELECT 语句返回数据,除非您的语句取决于所返回的数据。 如果使用 SELECT 语句,则只选择所需要的行,以免锁定过多资源,并使性能尽可能保持良好。 58
事务与性能(续) 尝试完全用SQL或API编写事务。二者混用只会引起混乱。 避免事务合并多个相互独立的批处理工作。 9.9 事务与性能 尝试完全用SQL或API编写事务。二者混用只会引起混乱。 避免事务合并多个相互独立的批处理工作。 如果可能的话, 尽量避免大规模更新。 59
第9章 事务 事务的概念 ADO.NET的事务支持 Transaction类 通过使用ADO.NET来执行事务 隔离级别 应用事务的高级技巧 第9章 事务 事务的概念 ADO.NET的事务支持 Transaction类 通过使用ADO.NET来执行事务 隔离级别 应用事务的高级技巧 分布式事务 使用事务的时机 事务与性能 事务与用户确认 小结 实验 习题 60
事务与用户确认 要求对用户账款的转移操作进行确认。程序遵照下面的操作顺序执行。 打开一个连接 。 启动一个事务。 执行各种查询 。 9.10 事务与用户确认 要求对用户账款的转移操作进行确认。程序遵照下面的操作顺序执行。 打开一个连接 。 启动一个事务。 执行各种查询 。 弹出消息框, 要求用户对事务进行确认 。 一旦收到确认信息后,提交事务 。 如果没有收到确认信息,则回滚事务 。 61
第9章 事务 事务的概念 ADO.NET的事务支持 Transaction类 通过使用ADO.NET来执行事务 隔离级别 应用事务的高级技巧 第9章 事务 事务的概念 ADO.NET的事务支持 Transaction类 通过使用ADO.NET来执行事务 隔离级别 应用事务的高级技巧 分布式事务 使用事务的时机 事务与性能 事务与用户确认 小结 实验 习题 62
小结 9.11 小结 本章介绍了单数据库中的事务,从保存点、嵌套事务以及新的称为 MARS 的 SQL Server 2005 特有功能的角度, 讨论了事务中所存在的各种细微差别。 63
第9章 事务 事务的概念 ADO.NET的事务支持 Transaction类 通过使用ADO.NET来执行事务 隔离级别 应用事务的高级技巧 第9章 事务 事务的概念 ADO.NET的事务支持 Transaction类 通过使用ADO.NET来执行事务 隔离级别 应用事务的高级技巧 分布式事务 使用事务的时机 事务与性能 事务与用户确认 小结 实验 习题 64
实验 9.12 实验 参照实验手册,并在教师的指导下完成实验报告。 65
第9章 事务 事务的概念 ADO.NET的事务支持 Transaction类 通过使用ADO.NET来执行事务 隔离级别 应用事务的高级技巧 第9章 事务 事务的概念 ADO.NET的事务支持 Transaction类 通过使用ADO.NET来执行事务 隔离级别 应用事务的高级技巧 分布式事务 使用事务的时机 事务与性能 事务与用户确认 小结 实验 习题 66
习题 9.13 习题 1. 一个Windows 窗体应用程序中的方法在 Microsoft SQL Server 2005 数据库中执行一个存储过程,然后在另一个 SQL Server 2005 数据库中执行另一个存储过程。要求确保只有在对第二个存储过程的调用成功时,对第一个存储过程的调用才会写入更改。安装要求禁止引入使用 COM+ 宿主模型的新组件。您应该______ 。 A.实施事务性服务组件。向此组件添加方法,以封装连接操作和每个存储过程的执行。注册并使用此服务组件 B.添加 TransactionScope 块。连接到每个数据库并在 TransactionScope 块内执行每个存储过程。如果对这两个存储过程的调用都成功,则调用TransactionScope.Complete() 方法 C.连接到这两个数据库。为每个连接调用SqlConnection.BeginTransaction() 方法。只有在这两个存储过程都成功时,才在两个返回的事务上都调用SqlTransaction.Commit ()方法 D.添加 try-catch-finally 语句块。连接到每个数据库并在 try 块中执行每个存储过程 67
习题(续) 9.13习题 2. TransactionScope类用来构建一个Transaction Scope,这个Scope内的代码将具备Transaction的能力。TransactionScope实现了IDisposable,在调用TransactionScope.Dispose()时,如果Consistent属性未被设置成true,那么将触发______动作。 68
习题(续) 3. 实现以下代码,可获得的效果是______ 。 9.13 习题 3. 实现以下代码,可获得的效果是______ 。 using (TransactionScope ts = new TransactionScope()) { UpdateOrder(); UpdateAccount(); ts.Complete(); } A. 只有在 UpdateOrder()方法成功时,才提交因 UpdateAccount ()方法导致的对数据库所做的更改 B. 只有在UpdateAccount()方法成功时,才提交因UpdateOrder()方法导致的对数据库的更改 C. UpdateOrder()和UpdateAccount(),可以同时提交 69
习题(续) 9.13 习题 4. 正在创建一个 Windows 窗体应用程序。该应用程序执行需要几秒钟才能完成存储过程。将会调用该存储过程来填充 SqlDataReader 对象。 需要确保当存储过程正在执行时,应用程序仍能响应用户请求。 您应该______ 。 A. 使用 SqlCommand.BeginExecuteReader ()方法调用存储过程。 使用 EndExecuteReader()方法检索结果 B. 使用 SqlCommand.ExecuteReader ()方法。 将此方法的行为参数设置为 CommandBehavior.SequentialAccess C. 创建 SqlDependency 对象并将其绑定到 SqlCommand 对象。调用 SqlCommand.ExecuteReader ()方法。将 OnChanged 事件处理程序与 SqlDependency 对象关联。在 OnChanged 事件处理程序方法中收集结果 D. 将 SqlCommand 对象的 Notification 属性设置为 SqlNotificationRequest 对象。 调用 SqlCommand.ExecuteReader ()方法。在后台线程上收集结果 70
习题(续) 5. 事务的主要特点有原子性(Atomic)、________、_____________和可持续性(Durable)。 9.13 习题 5. 事务的主要特点有原子性(Atomic)、________、_____________和可持续性(Durable)。 71
习题(续) 9.13 习题 6. 事务可以分为本地事务和_________,也可以分为_________和自动事务。 72
习题(续) 9.13 习题 7. 当若干事务同时访问同一数据时, 可能发生________、不可重复读和_________。 73