Spring 的官方的事務控制
Spring 官方版的事務控制
- 什麽是事務?
事務是數據庫(RDB)保證業務操作完整性的一種機制(強一致性)
- 事務在那裏控制
業務層控制(Service 或Biz 或Business)
- 如何控制事務(不同的底層不同的控制)
如果是JDBC:----Connnection
Connection.setAutoCommit(false)
Connection.commit()
Connection.rollback()
如果是Hibernate ------Session ---SessionFactory
Transaction tx = session.beginTransaction();
Tx.commit();
Tx.rollback();
- Spring中如何控制事務(AOP 動態代理開發)
1) 原始對象(Service 調用Dao完成業務處理)
創建Service接口和ServiceImpl接口(由於Service需要使用Dao所以私有化然後進行註入)
2) 額外功能:
【1】 控制事務的代碼MethodInterceptor註入 SessionFactory
- org.springframework.orm.hibernate3.HibernateTransactionManager
【2】 事務屬性:
隔離屬性,ISOLATION
解決並發問題的特點。
並發(同一時間,多個用戶訪問相同的數據)
- 數據的臟讀:一個事務讀取了另一個事務未提交的數據(隔離屬性可以解決)ISOLATION_READ_COMMITIED 默認
- 數據的不可重復讀:一個事務對相同的數據進行多次讀取,結果不一致解決:ISOLATION_REPREATALBE_READ 對應的是數據庫的行鎖
- 數據的幻影讀:在一個事務,進行統計工作中,對相同的表進行多次統計,但是結果不一致。ISOLATION_SERIALIZABLE_READ
傳播屬性
事務嵌套:(Service調用其他Service(大型項目中才會有))
普遍(Service-DAO)
PROPAGATION_REQUIRED:當外部不存在事務,則開啟事務,
當外部存在事務,則進行融合
增刪改方法使用
PROPAGATION_SUPPORTS:當外部不存在事務,則不開啟事務
當外部存在事務,則融合事務
查詢的時候使用
只讀屬性,默認是false
如果你的事務是查詢的時候,指定read-only 為true 提高系統效率
實戰中應該這麽寫:
異常屬性,
Spring 默認對於RuntimeException 及其子類, 回滾策略
Exception 及其子類 提交策略
遇到一個異常的時候如果你想回滾:rollback-for=“異常的全限定名”
如果你不想回滾的的話:no-rollback-for=”異 常的全限定名”
超時屬性(timeout)-1
當數據被另一個事務鎖住的時候,通過超時屬性決定等待時間
3) 切入點
4) 組裝切面
開發中應該以包為基礎進行切面。
實例:切面和屬性
:
Spring 的官方的事務控制