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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

将不确定变为确定~transactionscope何时提升为分布式事务?(sql2005数据库解决提升到MSDTC的办法)...

發(fā)布時(shí)間:2023/12/20 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 将不确定变为确定~transactionscope何时提升为分布式事务?(sql2005数据库解决提升到MSDTC的办法)... 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

回到目錄

對(duì)于transactionscope不了解的同學(xué),可以看我的相關(guān)文章

?

第二十六回 ? 將不確定變?yōu)榇_定~transactionscope何時(shí)提升為分布式事務(wù)?

第二十七回?? 將不確定變?yōu)榇_定~transactionscope何時(shí)提升為分布式事務(wù)~續(xù)

第二十八回?? 將不確定變?yōu)榇_定~transactionscope何時(shí)提升為分布式事務(wù)~再續(xù)(避免引起不必要的MSDTC)

第二十九回 ? 將不確定變?yōu)榇_定~transactionscope何時(shí)提升為分布式事務(wù)~大結(jié)局

第三十七回?? 將不確定變?yōu)榇_定~transactionscope何時(shí)提升為分布式事務(wù)~SQL2005與SQL2008不同

聲明:

對(duì)于這種事務(wù),如果希望程序出錯(cuò)自動(dòng)回滾,必須將異常throw出來(lái),不能愉愉的用日志記錄!

測(cè)試:

對(duì)于sql2008已經(jīng)很好的支持了transactionscope,而對(duì)于sql2005來(lái)說(shuō),支持的不是很好,它將多個(gè)savechanges()方法提升為分布式事務(wù)msdtc,它不管你是否為一個(gè)數(shù)據(jù)庫(kù),真是無(wú)奈了!還好,最好找到了解決方法,下面圖所示,將多個(gè)insert,update包裹到一個(gè)transactionscope里,所產(chǎn)生的結(jié)果如下:

簡(jiǎn)單來(lái)說(shuō),就是sp_reset_connection重新使用一次SQL鏈接時(shí),你的事務(wù)里的代碼是被包裹在一起發(fā)送過(guò)來(lái)的,這時(shí),如果有一條SQL語(yǔ)句出現(xiàn)異常,整個(gè)包會(huì)發(fā)生callback!

上面圖中,只要有一條語(yǔ)句出現(xiàn)SQL異常,都會(huì)發(fā)生回滾,從而保證了數(shù)據(jù)的完整性。

當(dāng)然,我們的計(jì)算機(jī)中,并沒(méi)有開(kāi)啟msdtc服務(wù),有圖有真像

前提:Db數(shù)據(jù)上下文對(duì)象必須與action指向的方法體里的上下文是同一個(gè)。

相關(guān)原始代碼為:

var objectContext = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)Db).ObjectContext;try{objectContext.Connection.Open();using (TransactionScope trans = new TransactionScope()){insert1();insert2();}}catch (Exception){throw;}finally{objectContext.Connection.Close();}

OK,我們將上面代碼進(jìn)行一個(gè)封裝,讓它訪(fǎng)問(wèn)起來(lái)更方便一些,看代碼:

/// <summary>/// Author:zhang.zhanling/// 對(duì)TransactionScope,讓它對(duì)同一個(gè)數(shù)據(jù)庫(kù)不產(chǎn)生msdtc服務(wù)/// </summary>public class TransactionScopeNoMsdtc{/// <summary>/// 產(chǎn)生包裹事務(wù)/// </summary>/// <param name="db">數(shù)據(jù)上下文</param>/// <param name="isOutermost">是否為最外層,默認(rèn)為false</param>/// <param name="action">處理代碼塊</param>public static void UsingNoMsdtc(DbContext db, bool isOutermost, Action action){var objectContext = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)db).ObjectContext;try{if (objectContext.Connection.State == System.Data.ConnectionState.Closed)objectContext.Connection.Open();using (TransactionScope trans = new TransactionScope()){action();trans.Complete();}}finally{if (isOutermost)//如果是最外層事務(wù),而將連接關(guān)閉 objectContext.Connection.Close();}}/// <summary>/// 產(chǎn)生包裹事務(wù),它不是最外層的,如果是最外層的需要調(diào)用其它重載/// </summary>/// <param name="db"></param>/// <param name="action"></param>public static void UsingNoMsdtc(DbContext db, Action action){UsingNoMsdtc(db, false, action);}}

?

在使用時(shí),我們可以這樣來(lái)做,不用TransactionScope,而是用TransactionScopeNoMsdtc呵呵。

EntityFrameworks.Data.Core.TransactionScopeNoMsdtc.UsingNoMsdtc(Db, () =>{insert1();insert2();});

感謝閱讀!

回到目錄

總結(jié)

以上是生活随笔為你收集整理的将不确定变为确定~transactionscope何时提升为分布式事务?(sql2005数据库解决提升到MSDTC的办法)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。