将不确定变为确定~transactionscope何时提升为分布式事务?(sql2005数据库解决提升到MSDTC的办法)...
回到目錄
對(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)題。
- 上一篇: 降息还是加息?
- 下一篇: linux cmake编译源码,linu