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 如果一個活動的事務存在,則運行在一個嵌套的事務中,如果沒有活動事務,則按第一個屬性執行