1. 程式人生 > >Spring 的官方的事務控制

Spring 的官方的事務控制

commit back zab cep actor repr 等待時間 exce 相同

Spring 官方版的事務控制

  1. 什麽是事務?

事務是數據庫(RDB)保證業務操作完整性的一種機制(強一致性)

  1. 事務在那裏控制

業務層控制(Service 或Biz 或Business)

  1. 如何控制事務(不同的底層不同的控制)

如果是JDBC:----Connnection

Connection.setAutoCommit(false)

Connection.commit()

Connection.rollback()

如果是Hibernate ------Session ---SessionFactory

Transaction tx = session.beginTransaction();

Tx.commit();

Tx.rollback();

  1. Spring中如何控制事務(AOP 動態代理開發)

1) 原始對象(Service 調用Dao完成業務處理)

創建Service接口和ServiceImpl接口(由於Service需要使用Dao所以私有化然後進行註入)

技術分享

技術分享

2) 額外功能:

【1】 控制事務的代碼MethodInterceptor註入 SessionFactory

  • org.springframework.orm.hibernate3.HibernateTransactionManager

技術分享

【2】 事務屬性:

技術分享

隔離屬性,ISOLATION

解決並發問題的特點。

並發(同一時間,多個用戶訪問相同的數據)

  1. 數據的臟讀:一個事務讀取了另一個事務未提交的數據(隔離屬性可以解決)ISOLATION_READ_COMMITIED 默認
  2. 數據的不可重復讀:一個事務對相同的數據進行多次讀取,結果不一致解決:ISOLATION_REPREATALBE_READ 對應的是數據庫的行鎖
  3. 數據的幻影讀:在一個事務,進行統計工作中,對相同的表進行多次統計,但是結果不一致。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 的官方的事務控制