关于使用Transaction对于非数据库事务的操作
在操作數(shù)據(jù)庫(kù)的過程中,為了數(shù)據(jù)的一致性,我們可以使用Transaction,要么成功的時(shí)候全部提交,要么有任何一個(gè)操作失敗立即全部回滾。不僅僅是在數(shù)據(jù)庫(kù)方面,有時(shí)候操作其他的內(nèi)容,比如說對(duì)于系統(tǒng)文件的操作,也需要把一些操作組合看做是一個(gè)事務(wù)。
?
現(xiàn)在我們看這樣一個(gè)例子。現(xiàn)在我們需要在計(jì)算機(jī)的硬盤上創(chuàng)建3個(gè)目錄A,B,C,要求要么3個(gè)全部創(chuàng)建成功,要么一個(gè)也不要?jiǎng)?chuàng)建。我們可以把這個(gè)看成是一個(gè)事務(wù)。如果我們自己寫代碼來操作,可以這樣寫。
?
[csharp]?view plaincopy?
但是這里我們是把這3個(gè)操作當(dāng)成一個(gè)整體來回滾,及時(shí)是簡(jiǎn)單的創(chuàng)建刪除文件夾,我們可以看到catch中的回滾邏輯已經(jīng)很復(fù)雜了。可以想象,如果A,B,C這3步不僅僅是創(chuàng)建目錄,還有一些其他的操作,那么回滾的邏輯就非常復(fù)雜,此時(shí),我們可以考慮把這一個(gè)分成幾個(gè)小事務(wù),分開回滾。代碼可以這樣寫,這里我們使用了Framework提供的Transactin以及TransactioScope類。
?
[csharp]?view plaincopy
這里的機(jī)制是這樣的,可能是scope.Complete()方法中有某種特別的操作,去告訴CLR這次所有的操作都順利完成了,在跳出這個(gè)scope的時(shí)候就不用調(diào)用那些transaction的rollback方法了。如果沒有執(zhí)行到scope.Complete()方法,那么就會(huì)在跳出這個(gè)scope代碼塊的時(shí)候調(diào)用rollback方法。一般造成這個(gè)的原因是在某個(gè)transaction的邏輯操作中出現(xiàn)異常,造成從此次直接拋出異常跳出這個(gè)代碼塊,沒有機(jī)會(huì)執(zhí)行下邊的代碼。可以看出這里的重點(diǎn)也是寫rollback的邏輯,但是相對(duì)于原來的catch中的邏輯,這里分開為多個(gè)小的邏輯,相對(duì)來說容易了很多。
這只是個(gè)人寫的一種使用回滾的邏輯。在使用IEnlistmentNotification的時(shí)候,也有人把業(yè)務(wù)邏輯寫入到Commit中。如果想真正理解transaction回滾的機(jī)制,建議深入理解一下TransactionScope與Transactiond的實(shí)現(xiàn)機(jī)制。
轉(zhuǎn)載于:https://www.cnblogs.com/sky6699/p/4535760.html
總結(jié)
以上是生活随笔為你收集整理的关于使用Transaction对于非数据库事务的操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Silverlight 2.5D RPG
- 下一篇: mysql授权账号查询权限_【MySQL