ADO.NET 2.0 新增 System.Transaction 命名空间与相关类,提供自动提升的事务管理(Promotable Transaction)。虽然 T-SQL 可以通过 BEGIN TRANSACTION 或 BEGIN DISTRIBUTED TRANSACTION 打开本地或远端事务,但程序设计师可能会希望直接通过程序代码访问多个数据库服务器,例如多个 SQL Server 实例,当打开事务后,ADO.NET 2.0 可以检测到需要提升事务,而自动由本地事务(Local Transaction)转成分布式事务(Distributed Transaction)。
其实,只要你打开两条以上的连接,尽管这两条连接是访问同一个数据库,都会发生分布式事务,就因为需要 DTC(Distributed Transaction Coordinator)的参与,将会导致速度比原先本地事务慢 10 倍以上。以下是一个简单的自动由本地事务提升成分布式事务的程序代码范例:
程序代码列表12-18 通过 TransactionScope 来管理事务执行的方式
Using ts As New TransactionScope
'通过 Enlist 选项设置若有 TransactionScope 就加入
Dim cnn As New SqlConnection("Data Source=.;Initial Catalog=AdventureWorks;" & _
"Integrated Security=SSPI;Enlist=true")
cnn.Open()
'此为 local 事务,所以在此设断点,通过 COM+ 不会看到任何内容
Dim cmd As New SqlCommand("CREATE TABLE tblTestTX(C1 int)", cnn)
cmd.ExecuteNonQuery()
Dim cnn2 As New SqlConnection("Data Source=.;Initial Catalog=AdventureWorks;Integrated Security=SSPI")
cnn2.Open() '自动升成 distributed 事务,可在下一行指令设置断点,利用 COM+ 观察
Dim cmd2 As New SqlCommand("INSERT tblTestTX VALUES(1)", cnn2)
cmd2.ExecuteNonQuery()
ts.Consistent = CheckBox1.Checked 'true 就 commit 事务,否则 rollback
End Using
在单步调试上述范例应用程序时,你可以搭配 Windows 系统提供的“组件服务”管理界面来观察 DTC 的执行状况,例如查看当前正在执行的分布式事务,或是自 DTC 服务启动以来累积完成的或放弃的事务数量。
你可以看到当仅开起一条连接时,“事务列表(Transaction List)”内并不会有分布式事务,但当第二条连接打开后,就会自动出现一个分布式事务,画面如图12-14 所示:

图12-14 通过组件服务(Component Services)管理画面查看正在运行的分布式事务
通过程序代码最后的 Consistent 属性设为 True 或 False,可以告知是要完成事务还是恢复之前所做的事务内容。而自 DTC 服务启动后累积的事务统计数据可以在“事务统计(Transaction Statistics)”节点中看到,如图12-15所示。

图12-15 程序执行完毕后可以通过组件服务查看自 DTC 启动后累计完成的已认可(Committed) 或已中止(Aborted)分布式事务的次数





