spring 事務

spring事務

  • 聲明式事務
  • 編程式事務

聲明式事務

組成 (在進行劃分時,需要進行事務定義【配置事務屬性】)

  • 傳播行爲
  • 隔離級別
  • 超時值
  • 只讀標誌

TransactionDefinition接口

  • 屬性
    • 返回傳播行爲 getPropagationBehavior()
    • 返回隔離級別 getIsoliationLevel()
    • 返回多少秒內完成 getTimeOut()
    • 判斷是否只讀 isReadOnly()
  • 五個隔離級別
    • ISOLATION_DEFAULT 默認 使用數據庫默認的事務隔離級別
    • ISOLATIONREADUNCOMMITTED 最低 另一事務可看到該未提交數據 可髒讀 不可重複讀和幻想讀
    • ISOLATIONREADCOMMITTED 事務提交後數據才能被另一個事務讀取 不可髒讀 不可重複讀和幻想讀(可能)
    • ISOLATIONREPEATABLEREAD 防止髒讀 不可重複讀 可能幻像讀
    • ISOLATION_SERIALIZABLE 最高級別 代價最高 不可髒讀、重複讀、幻象讀
  • 名詞解釋
    • dirty read(髒讀)事務A未提交 數據被事務B讀取 如事務A回滾 則事務B數據讀取錯誤
    • non-repeatable reads(不可重複讀) 事務A讀了兩次的值 讀一次之後 事務B將值改變 A第二次讀發現數據不一致 造成數據混亂
    • phantom reads(幻象讀) 這個和non-repeatable reads相似,也是同一個事務中多次讀不一致的問題。但是non-repeatable reads的不一致是因爲他所要取的數據集被改變了(比如total的數據),但是phantom reads所要讀的數據的不一致卻不是他所要讀的數據集改變,而是他的條件數據集改變。比如Select account.id where account.name=”ppgogo*”,第一次讀去了6個符合條件的id,第二次讀取的時候,由於事務b把一個帳號的名字由”dd”改成”ppgogo1″,結果取出來了7個數據。
  • 在接口中定義的七個傳播行爲
    • PROPAGATION_REQUIRED(必須) 如有事務則支持當前,如果沒有事務則開啓一個新的事務
    • PROPAGATION_SUPPORTS 支持) 如有事務則支持當前,如無,則非事務的執行
    • PROPAGATION_MANDATORY (強制) 如有事務則支持當前,如果沒有一個活動的事務,則拋出異常
    • PROPAGATIONREQUIREDNEW 總是開啓一個新事務,如已經存在,則將這個事務掛起
    • PROPAGATIONNOTSUPPORTED 總是非事務的執行,並掛起任何存在的事務
    • PROPAGATION_NEVER 總是非事務的執行,如果存在一個活動事務,則拋出異常
    • PROPAGATION_NESTED 如果一個活動的事務存在,則運行在一個嵌套的事務中,如果沒有活動事務,則按第一個屬性執行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章