使用KTM 核心事務管理器 進行檔案事務處理

2021-09-05 04:23:04 字數 2928 閱讀 6087

在本人最近的幾篇關於事務處理的文章中,從事務處理的整體概念到具體的c#**的實踐操作基本上都已經能滿足日常的開發需求。文章中大部分的事務範圍類的操作都是侷限於資料庫,在本人的「.net簡談自定義事務資源管理器

從資料庫到自定義資源管理器都能參與到事務處理中來,在必要的時候保證資料的完整性,那麼我們缺乙個型別的資源操作,當然您也許早就想問了,關於檔案系統的事務操作怎麼辦?那麼關於檔案的事務操作是否有成熟的解決方案了,這點在前幾年還真沒辦法,但是最近微軟已經發布了關於事務性ntfs系統。都了解ntfs檔案系統的優勢和好處,比起fat和其他的什麼hpfs檔案系統有極大的改進,所以檔案事務處理僅支援ntfs格式的檔案系統。

在前幾篇文章中都是使用的ltm本地事務管理器,然後進行事務範圍類的多個持久資源登記自動事務提公升為dtc型別的事務操作,由於dtc是非託管的實現,所以在分布式事務操作中會存在資料封送的效能損耗,msdn也提倡盡量少用dtc處理,由於存在著很多不確定因素在遇到問題時比較棘手。但是在關鍵的時候還是需要這麼用的,我們有必要去研究研究。

ktmdtcltm三者的使用關係簡單介紹

以前的理解思路和講解的角度對於ktm來說是沒多大關係的,但是由於他的出現我們有必要回歸到原點進行重新的梳理來進行乙個更加系統深入的理解,僅僅是理解;

在查詢了大量的msdn文件和對system.transaction命名空間的仔細翻閱發現微軟隱藏了很多.net事務實現細節,比如system.transaction.oletx命名空間下的具體分布式協議的實現是沒有任何技術文件看的,只能反編譯自己看**琢磨。

反編譯看了部分**,其中都會涉及到p\invoke和com\interop之類的**,憑自己的理解它的目的是啟動idtctransaction介面,也就是com介面。理解這一點對於我們下面的ktm操作非常有利。ltm要想進行dtc管理就必須通過ole32.dll進行com介面的載入也就是我們託管的.net類庫裡面的idtctransaction介面,看一下**:

//  describes a dtc transaction. 

[guid("0fb15084-af41-11ce-bd2b-204c4f4f5020")]  

[inte***cetype(cominte***cetype.inte***ceisiunknown)]  

public

inte***ce idtctransaction  

該介面是向com公開時的型別,用作於com互操作使用的,需要通過該介面進行dtc的提公升使用;為了驗證理解是否正確我們來進行乙個簡單的測試,我們手動的通過system.transaction.transactioninterop類來獲取非託管的idtctransaction介面,請看**:

ltm事務:

public

static

void startcopy()  

}  這樣的**是不會提公升為dtc管理的,我們加一行**:

public

static

void startcopy()  

}  先解釋一下transactioninterop類的作用,來自msdn的說明:

「促進system.transactions 和以前編寫的用於與 msdtc、com+ 或 system.enterpriseservices 進行互動的元件之間的互動。無法繼承此類。」

利用transactioninterop.getdtctransaction方法確實能獲取到dtc事務介面。

圖1:有了transactioninterop類,我們後面的擴充套件就方便多了。

由於ktm是屬於非託管實現,作業系統提供了檔案操作的事務性api方法:

非事務處理 api

事務處理 api

createfile

createfiletransacted

copyfileex

copyfiletransacted

movefilewithprogress

movefiletransacted

deletefile

deletefiletransacted

createhardlink

createhardlinktransacted

createsymboliclink

createsymboliclinktransacted

createdirectoryex

createdirectorytransacted

removedirectory

removedirectorytransacted

通過封裝這些方法就能夠實現事務性的檔案操作,目前.net沒有封裝成熟的類庫給我們使用,估計在後期的新版本類庫中可能會提供。

原始碼都是通過對上面的api進行封裝的,裡面涉及到了很多關於內部api和com之間的通訊細節,我們可以看看老外寫的**是複雜,也是我們學習的榜樣。

上面我們說過只要誇當前應用程式域的事務處理就會自動提公升為dtc事務,對於api的呼叫已經是出於互操作型別的,當前已經出於遠端呼叫,dtc已經具有與託管域的互動實現,所以我們只有通過dtc進入ktm進行操作。這也是msdn官方的解釋。

圖2:我們來看乙個簡單的例子,該例子實現對檔案的事務性刪除操作。

例子1:

public

static

void startdelete()  

}  catch (exception err)   

我簡單的寫了一段測試**,經過測試是ok的。ktm能很好的結合dtc、ltm進行混合的事務處理,對於我們上面引入的疑問現在能完美的解決了。 

參考文章:

MS DTC 事務管理器啟動失敗

ms dtc 事務管理器啟動失敗 有關更多資訊,請參閱在 http go.microsoft.com fwlink events.asp http go.microsoft.com fwlink events.asp 的幫助和支援中心。2 無法啟動 ms dtc 事務管理器。有關更多資訊,請參閱在 ...

spring 註解驅動 事務管理器

需要匯入的依賴 com.mchange c3p0 0.9.5.5 org.springframework spring aspects 5.2.5.release org.springframework spring jdbc 5.2.4.release 使用jdbctemplate 運算元據庫 u...

spring事務管理器與編碼事務的協調

理想情況下我們的業務元件事務全部通過spring宣告,但是一些特殊的業務方法 特別是涉及到外部系統介面呼叫的情形 我們往往需要編碼實現事務的提交與回滾,這時應該怎麼辦呢?假如我們編碼事務的 中還需要呼叫spring控制的業務元件方法 這些方法同時被正常的web請求使用 這時該怎麼辦呢?首先回答第乙個...