这是我的备份,原文请看 http://www.dotblogs.com.tw/mis2000lab/archive/2014/11/12/transactionscope_promotable_transaction_net45.aspx
书本下集,有一章提及数据库交易与ADO.NET的用法
最简单的就是使用 System.Transaction命名空间里面的「TransactionScope」来做
提醒您:
请先动手「加入参考」,才能呼叫 System.Transaction这个命名空间!
微软MSDN上面有篇文章,我看了还是不懂
套用我的方法,做中学
直接看程序代码
做了以后再来看文字讨论(抽象概念)
果然一次就搞懂了
................................................................................................................................................
数据源:与 SQL Server 进行 System.Transactions 整合
以下范例示范如何针对由两个不同的 SqlConnection对象(两个DB链接),
并包装于 TransactionScope区块中的两个不同 SQL Server实例,建立可提升(Promotable)交易。
using (TransactionScope scope = new TransactionScope())
{
// 第一个 DB连结
程序代码会使用 using…区块来建立 TransactionScope区块,并开启第一个连接,这样会自动在 TransactionScope中登记它。
一开始交易登记为「轻量型(本机)交易」,而不是完全分布式交易。
using (SqlConnection conn1 = new SqlConnection(connectString1))
{
try {
conn1.Open();
SqlCommand com1 = new SqlCommand(SqlStr1, conn1);
com1.ExecuteNonQuery();
// 第二个 DB连结
只有当第一个连接中的Command”没有”掷回例外状况时,第二个连接才会登记于 TransactionScope中。
开启第二个连接时,交易会自动提升为「完全分布式交易」。
using (SqlConnection conn2 = new SqlConnection(connectString2))
try {
conn2.Open();
SqlCommand com2 = new SqlCommand(SqlStr2, conn2);
com2.ExecuteNonQuery();
}
catch (Exception ex2) {
// 例外状况
}
}
catch (Exception ex1) {
// 例外状况
}
}
scope.Complete();
//此时,系统会叫用 .Complete()方法,只有在”没有掷回”任何例外状况时才会认可交易。
}
................................................................................................................................................
从第一个连结 "成功"以后(登记为「轻量型(本机)交易」),
然后进入第二个连结(自动提升为「完全分布式交易」),
...... 这样的步骤就是「可提升(Promotable)交易」。
回头看看 MSDN上面讲过的这句话--
「除了增强程序设计之外,在处理交易时System.Transactions命名空间还会与 ADO.NET一起运作协调出最佳效能。
可提升的(Promotable)交易可以依照实际状况,自动提升为”完全分布式”交易的轻量型(本机)交易(lightweight (local) transaction)」
先做过一次,再来参阅理论(抽象观念),
是不是更清楚了呢?
相关文章,请参阅微软MSDN
与 SQL Server 进行 System.Transactions 整合
http://msdn.microsoft.com/zh-tw/library/ms172070(v=vs.110).aspx