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