日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

分布式事物嵌套事物

發布時間:2025/1/21 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分布式事物嵌套事物 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.內部事物 需?using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew))? 否則會出現“已終止事物” 的錯誤

TransactionScope 分布式事務的使用案例 以及簡單說明

?TransactionScope 是的.net Framework2.0版本中增加的一個新命名空間。他的用途是為數據庫訪問提供一個“輕量級”的事物。使用之前必須添加對 System.Transactions.dll 的引用。先介紹介紹幾個簡單的參數。

?

TransactionScopeOptions描述
Required如果已經存在一個事務,那么這個事務范圍將加入已有的事務。否則,它將創建自己的事務。
RequiresNew這個事務范圍將創建自己的事務。
Suppress如果處于當前活動事務范圍內,那么這個事務范圍既不會加入氛圍事務 (ambient transaction),也不會創建自己的事務。當部分代碼需要留在事務外部時,可以使用該選項。

您可以在代碼的任何位置上隨是查看是否存在事務范圍,具體方法就是查看 System.Transactions.Transaction.Current 屬性。如果這個屬性為“null”,說明不存在當前事務。
?????? 若要更改 TransactionScope 類的默認設置,您可以創建一個 TransactionOptions 對象,然后通過它在 TransactionScope 對象上設置隔離級別和事務的超時時間。TransactionOptions 類有一個 IsolationLevel 屬性,通過這個屬性可以更改隔離級別,例如從默認的可序列化 (Serializable) 改為ReadCommitted,甚至可以改為 SQL Server 2005 引入的新的快照 (Snapshot) 級別。(請記住,隔離級別僅僅是一個建議。大多數數據庫引擎會試著使用建議的隔離級別,但也可能選擇其他級別。)此 外,TransactionOptions 類還有一個 TimeOut 屬性,這個屬性可以用來更改超時時間(默認設置為 1 分鐘)。
TransactionOptions opt= new TransactionOptions();
//設置TransactionOptions

opt.IsolationLevel = IsolationLevel.ReadCommitted;
// 設置超時間隔為2分鐘,默認為60秒
opt.Timeout = new TimeSpan(0, 2, 0);

使用時候將

using (TransactionScope sCope = new TransactionScope(TransactionScopeOption.RequiresNew, opt))

其他和默認一樣

下面做一個簡單的demo 只需要添加很少的幾行代碼,這個模型可以對異常進行處理,執行結束后會自行清理,此外,它還可以對命令的提交或回滾進行管理

1.TransactionScope? 在一個事務范圍內

在app.config中

?

<connectionStrings>
??? <add name="myCon" connectionString="Data Source=.;uid=sa;pwd=sa;database=B2C3;Asynchronous Processing=true"/>
??? <add name="myCon2" connectionString="Data Source=.;uid=sa;pwd=sa;database=b2c;Asynchronous Processing=true"/>
??? <add name="myCon3" connectionString="Data Source=.;uid=sa;pwd=sa;database=demo;Asynchronous Processing=true"/>
??? <add name="myCon4" connectionString="Data Source=.;uid=sa;pwd=sa;database=News;Asynchronous Processing=true"/>


? </connectionStrings>

?

?

?static void Main(string[] args)
??????? {
?????????? string constr = ConfigurationManager.ConnectionStrings["myCon"].ConnectionString;
??????????? string constr2 = ConfigurationManager.ConnectionStrings["myCon2"].ConnectionString;
??????????? string sql = "insert into [Tuser](username,pwd,age) values('新聞socpe測試','bbb',10)";
??????????? #region 不同庫的事務
??????????? using (TransactionScope sope = new TransactionScope())
??????????? {

???????????????? using(SqlConnection con =new SqlConnection(constr))
??????????????? {
??????????????????? using (SqlCommand cmd = new SqlCommand(sql, con))
??????????????????? {
??????????????????????? con.Open();
????????????????????? int a=? cmd.ExecuteNonQuery();
????????????????????? Console.WriteLine(a);
???????????????????
??????????????????? }
??????????????????
???????????????
??????????????? }
??????????????? using (SqlConnection con = new SqlConnection(constr2))
??????????????? {
??????????????????? using (SqlCommand cmd = new SqlCommand(sql, con))
??????????????????? {
??????????????????????? con.Open();
??????????????????????? int b = cmd.ExecuteNonQuery();
??????????????????????? Console.WriteLine(b);

??????????????????? }


??????????????? }

??????????????? addOtherUser();
??????????????? sope.Complete();

?

??????????? }
??????????? #endregion

??? sope.Complete(); 是個標示。只有全部運行才提交事務

2.嵌套 調用事務

?

??????? static void Main(string[] args)
??????? {


??????????? string constr = ConfigurationManager.ConnectionStrings["myCon"].ConnectionString;
??????????? string constr2 = ConfigurationManager.ConnectionStrings["myCon2"].ConnectionString;
??????????? string sql = "insert into [Tuser](username,pwd,age) values('新聞socpe測試','bbb',10)";
??????????? #region 不同庫的事務
??????????? using (TransactionScope sope = new TransactionScope(TransactionScopeOption.Required))
??????????? {

????????????
??????????????? using(SqlConnection con =new SqlConnection(constr))
??????????????? {
??????????????????? using (SqlCommand cmd = new SqlCommand(sql, con))
??????????????????? {
??????????????????????? con.Open();
????????????????????? int a=? cmd.ExecuteNonQuery();
????????????????????? Console.WriteLine(a);
???????????????????
??????????????????? }
??????????????????
???????????????
??????????????? }
??????????????? using (SqlConnection con = new SqlConnection(constr2))
??????????????? {
??????????????????? using (SqlCommand cmd = new SqlCommand(sql, con))
??????????????????? {
??????????????????????? con.Open();
??????????????????????? int b = cmd.ExecuteNonQuery();
??????????????????????? Console.WriteLine(b);

??????????????????? }


??????????????? }

??????????????? addOtherUser();
??????????????? sope.Complete();

?

??????????? }
??????????? #endregion

?

?

?


??????? }

??????? private static void addOtherUser()
??????? {
??????????? string constr3 = ConfigurationManager.ConnectionStrings["myCon3"].ConnectionString;
??????????? string constr4 = ConfigurationManager.ConnectionStrings["myCon4"].ConnectionString;
??????????? string sql1 = "insert into [hr_user](username,password) values('新聞socpe測試','bbb')";
??????????? string sql2 = "insert into [Users](username,userpwd) values('新聞socpe測試','bbb')";

??????????? //RequiresNew 這個事務范圍將創建自己的事務。
??????????? using(TransactionScope sope=new TransactionScope(TransactionScopeOption.RequiresNew))
??????????? {

??????????????? using (SqlConnection con = new SqlConnection(constr3))
??????????????? {
??????????????????? using (SqlCommand cmd = new SqlCommand(sql1, con))
??????????????????? {
??????????????????????? con.Open();
??????????????????????? int a = cmd.ExecuteNonQuery();
??????????????????????? Console.WriteLine(a);

??????????????????? }


??????????????? }
??????????????? using (SqlConnection con = new SqlConnection(constr4))
??????????????? {
??????????????????? using (SqlCommand cmd = new SqlCommand(sql2, con))
??????????????????? {
??????????????????????? con.Open();
??????????????????????? int b = cmd.ExecuteNonQuery();
??????????????????????? Console.WriteLine(b);

??????????????????? }


??????????????? }
??????????????? sope.Complete();
??????????? }
???????
??????? }

?

?總結:

現在知道了TransactionScope中的數據庫操作實際是參與了其中的環境事務,將它理解為是自動建立的SqlTransaction,而嵌套在其中的TransactionScope中的數據庫操作會添加到這個環境事務中(以TransactionScopeOption.Required為參數生成的TransactionScope)。

  也知道了Complete方法并不是執行后,就會提交事務,而只是表明之前的動作都符合要求,只是一種確認,不執行該方法,事務便不能完成。而 只有最外層TransactionScope執行了Complete方法后,在離開using塊時,事務才真正的提交。所以說 TransactionScope是能嵌套的。

  Transaction類有一靜態屬性Current,在一個TransactionScope中的Complete方法執行之前可以訪問,它返回的便是環境事務。

但是:?? 進入和退出事務都要快,這一點非常重要,因為事務會鎖定寶貴的資源。最佳實踐要求我們在需要使用事務之前再去創建它,在需要對其執行命令前迅速打開連接, 執行動作查詢 (Action Query),并盡可能快地完成和釋放事務。在事務執行期間,您還應該避免執行任何不必要的、與數據庫無關的代碼,這能夠防止資源被毫無疑義地鎖定過長的 時間

?

?


??????? }

總結

以上是生活随笔為你收集整理的分布式事物嵌套事物的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。