kodojdo指南第九章

第九章  事務

  事務用來保證事務完整性.它把操作集中到一個工作組,這個組裏的操作要麼全部成功,要麼全部失敗.事務有幾個特性
  1)原子性:原子性指事務的要麼全部成功-要麼全部失敗的屬性.要麼事務中的每個更新數據的操作都成功完成,要麼全部失敗.而不管數據在數據庫中的原始狀態是怎樣.事務不可能部分地成功.

  2)一致性.每個事務使數據庫的數據從一種連貫狀態到另一種連貫狀態.

  3)隔離性.事務彼此之間隔離.當你從事務讀取持久化數據的時候,如果其他事務沒有完成,你並不能看到被該事務導致的數據的變化.同樣地,你在一個事務的更新操作和另一個併發事務的更新操作並不衝突.衝突的形成依賴於你使用優化事務還是使用非優化事務.下節會介紹這兩種類型. 

  4)耐久性.成功事務的作用是耐久的.對持久化數據的更新持續到數據集的活動週期.(翻譯得不好)

  這幾種屬性合稱事務的"酸性".要理解爲什麼對維護數據完整性來說這些屬性如此重要,考慮下面的例子:
  假設你創建一個管理銀行帳戶的應用程序.這個程序包含一種方法,把一個帳號的資金轉到另一個.看起來應該這樣:

  現在假設A用戶想轉帳100元給b用戶.沒問題,你簡單調用transferFunds 方法,以帳戶a作爲form參數.以b帳戶作爲to參數.100元作爲總額.方法的第一句執行.從a帳戶裏減去了100元.不過,發生了意外的情況.也許是硬件的故障.你的方法沒有完成.
  現在你要面對這種情況,100元消失了.應該"感謝"你的函數,a帳戶減少了100元,而這100元並沒有轉到b帳戶.數據庫處於不一致狀態.
  現在事務的重要性清楚了.假如transferFunds的兩行方法一起放置在一個事務裏,就不可能出現只有方法的第一行成功的情況.當意外發生時,要麼轉帳成功,要麼根本不轉帳.錢不會消失到空氣裏,數據庫永遠不可能處於非一致性狀態.

  9.1 事務類型

(這裏應該是教程有錯)
  事務有兩種主要類型.樂觀的和悲觀的.每種類型都有其優缺點:
 
  當悲觀事務執行時,它會鎖住數據庫.阻止其他併發事務使用同樣的數據.這防止了事務的衝突.不過消耗了數據庫的大量資源.加之,鎖住數據會導致死鎖.有這麼一種情況:兩個事務都在等待對方完成後釋放數據的鎖,死鎖的結果依賴於數據庫:通常是在指定的時間流逝之後,事務會強迫性的回滾,並且會拋出異常.

  樂觀事務消耗較少的資源.代價是降低可靠性.因爲樂觀事務並不鎖住數據記錄,可能兩個事務會同時修改同一持久信息,在第二個事務提交之前,並不檢查衝突.此時,第二個事務會知道另一個併發的事務修改了同樣的記錄(通常通過時間戳或者版本體系),拋出適當的異常.要注意到樂觀事務仍然維護數據完整性,只不過在嚴重的併發情況下很可能失敗.

  9.2 JDO的事務接口

  事務接口管理JDO裏的事務.這個接口包括許多對屬性操作的類JAVA BEAN 風格的getter和setter方法,標準的事務劃分方法和測試事務是否活動的方法.

  事務的 NonTransactionalRead, NonTransactionalWrite, RetainValues, RestoreValues, 和Optimistic 對應在PersistenceManagerFactory 一節的設置屬性.最終的屬性如同步還沒有介紹.這個屬性允許你用一個javax.transaction.Synchronization實例關聯事務.事務完成之後,事務會告訴同步實例,所以你可以在提交或者回滾時實現自定義行爲.參考同步的javadoc文檔獲得更詳細信息.

  begin,commit和rollback方法給事務分界.顧名思義,begin開始一個事務,commit嘗試把事務對數據庫的操作提交,rollback放棄事務.此時數據庫回覆到事務開始前的狀態.如果事務提交過程中發生嚴重的錯誤,JDO會自動回滾.然而,假如你主動執行回滾操作,可以釋放所佔用的一些資源.

  最後,如果事務處於活動狀態,isActive 方法返回true.(begin方法的調用比commit和rollback要頻繁點).否則返回false.

發佈了34 篇原創文章 · 獲贊 0 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章