spring相關知識點和麪試點總結

sping事務只對RuntimeException和Error類型的異常生效 不對checked exceptions生效 就是try catch捕獲的異常

事務回滾的流程 捕獲異常 判斷異常類型 如果是RuntimeException和Error就進行roll back操作

  • status.hasSavepoint()如果status中有savePoint,只回滾到savePoint!
  • status.isNewTransaction()如果status是一個新事務,纔會真正去回滾!
  • status.hasTransaction()如果status有事務,將會對staus中的事務標記!

2 核心接口

Spring事務管理的實現有許多細節,如果對整個接口框架有個大體瞭解會非常有利於我們理解事務,下面通過講解Spring的事務接口來了解Spring實現事務的具體策略。 
Spring事務管理涉及的接口的聯繫如下:

2.1 平臺事務管理器(PlatformTransactionManager)

Spring並不直接管理事務,而是提供了多種事務管理器,他們將事務管理的職責委託給Hibernate或者JTA等持久化機制所提供的相關平臺框架的事務來實現。 
Spring事務管理器的接口是org.springframework.transaction.PlatformTransactionManager,
通過這個接口,Spring爲各個平臺如JDBC、Hibernate等都提供了對應的事務管理器,但是具體的實現就是各個平臺自己的事情了。
PlatformTransactionManager接口的內容如上圖:
主要定義了
getTransaction(TransactionDefinition definition) //獲取事務,
commit() //提交,
rollback() //回滾
方法。
而具體實現,我們常用的有:
DataSourceTransactionManager:使用jdbc來進行數據庫操作時,對事務進行管理, 
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean>
HibernateTransactionManager:使用hibernate進行操作時,對事務進行管理。
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean>

2.2 基礎事務屬性定義(TransactionDefinition)

上面講到的事務管理器接口PlatformTransactionManager通過getTransaction(TransactionDefinition definition)方法
傳入事務屬性定義來得到事務,
這個方法裏面的參數是TransactionDefinition類,這個類就定義了一些基本的事務屬性。 
那麼什麼是事務屬性呢?
事務屬性可以理解成事務的一些基本配置,描述了事務策略如何應用到方法上。事務屬性包含了5個方面,如圖所示:
TransactionDefinition接口的內容如上圖:
主要定義了
getPropagationBehavior() //獲取事務傳播行爲,
getIsolationLevel() //獲取事務隔離級別,
getTimeout() //獲取超時時間,
isReadOnly() //事務是否只讀
我們可以發現TransactionDefinition正好用來定義事務屬性,下面詳細介紹一下各個事務屬性。

2.2.1 傳播行爲

事務的第一個方面是傳播行爲(propagation behavior)。
當事務方法被另一個事務方法調用時,必須指定事務應該如何傳播。
Spring定義了七種傳播行爲:
傳播行爲
含義
PROPAGATION_REQUIRED
表示當前方法必須運行在事務中。如果當前事務存在,方法將會在該事務中運行。否則,會啓動一個新的事務
PROPAGATION_SUPPORTS
表示當前方法不需要事務上下文,但是如果存在當前事務的話,那麼該方法會在這個事務中運行
PROPAGATION_MANDATORY
表示該方法必須在事務中運行,如果當前事務不存在,則會拋出一個異常
PROPAGATION_REQUIRED_NEW
表示當前方法必須運行在它自己的事務中。一個新的事務將被啓動。如果存在當前事務,在該方法執行期間,當前事務會被掛起。如果使用JTATransactionManager的話,則需要訪問TransactionManager
PROPAGATION_NOT_SUPPORTED
表示該方法不應該運行在事務中。如果存在當前事務,在該方法運行期間,當前事務將被掛起。如果使用JTATransactionManager的話,則需要訪問TransactionManager
PROPAGATION_NEVER
表示當前方法不應該運行在事務上下文中。如果當前正有一個事務在運行,則會拋出異常
PROPAGATION_NESTED
表示如果當前已經存在一個事務,那麼該方法將會在嵌套事務中運行。嵌套的事務可以獨立於當前事務進行單獨地提交或回滾。如果當前事務不存在,那麼其行爲與PROPAGATION_REQUIRED一樣。注意各廠商對這種傳播行爲的支持是有所差異的。可以參考資源管理器的文檔來確認它們是否支持嵌套事務
可以看到以上有七種事務傳播行爲,經常使用到的爲標註了紅色的三種。REQUIRED是使用最頻繁的一個。

2.2.2 隔離級別

事務的第二個維度就是隔離級別(isolation level)。
隔離級別定義了一個事務可能受其他併發事務影響的程度。 
Spring定義了五種隔離級別:
隔離級別
含義
ISOLATION_DEFAULT
使用後端數據庫默認的隔離級別
ISOLATION_READ_UNCOMMITTED
最低的隔離級別,允許讀取尚未提交的數據變更,可能會導致髒讀、幻讀或不可重複讀
ISOLATION_READ_COMMITTED
允許讀取併發事務已經提交的數據,可以阻止髒讀,但是幻讀或不可重複讀仍有可能發生
ISOLATION_REPEATABLE_READ
對同一字段的多次讀取結果都是一致的,除非數據是被本身事務自己所修改,可以阻止髒讀和不可重複讀,但幻讀仍有可能發生
ISOLATION_SERIALIZABLE
最高的隔離級別,完全服從ACID的隔離級別,確保阻止髒讀、不可重複讀以及幻讀,也是最慢的事務隔離級別,因爲它通常是通過完全鎖定事務相關的數據庫表來實現的
Spring中,默認使用DEFAULT,即當前連接池中使用的數據庫的隔離級別。
Oracle默認的隔離級別爲:READ_COMMITTED
Mysql默認的隔離級別爲:REPEATABLE_READ

2.2.3 只讀

事務的第三個特性是它是否爲只讀事務。
如果事務只對後端的數據庫進行該操作,數據庫可以利用事務的只讀特性來進行一些特定的優化。
通過將事務設置爲只讀,你就可以給數據庫一個機會,讓它應用它認爲合適的優化措施。

2.2.4 事務超時

爲了使應用程序很好地運行,事務不能運行太長的時間。
因爲事務可能涉及對後端數據庫的鎖定,所以長時間的事務會不必要的佔用數據庫資源。
事務超時就是事務的一個定時器,在特定時間內事務如果沒有執行完畢,那麼就會自動回滾,而不是一直等待其結束。

2.2.5 回滾規則

事務五邊形的最後一個方面是一組規則,這些規則定義了哪些異常會導致事務回滾而哪些不會。
默認情況下,事務只有遇到運行期異常時纔會回滾,而在遇到檢查型異常時不會回滾(這一行爲與EJB的回滾行爲是一致的) 
但是你可以聲明事務在遇到特定的檢查型異常時像遇到運行期異常那樣回滾。同樣,你還可以聲明事務遇到特定的異常不回滾,即使這些異常是運行期異常。

2.3 事務狀態

上面講到的調用PlatformTransactionManager接口的getTransaction()的方法得到的是TransactionStatus接口的一個實現。
TransactionStatus接口的內容如上圖:
主要定義了
isNewTransaction(); // 是否是新的事物
hasSavepoint(); // 是否有恢復點
setRollbackOnly(); // 設置爲只回滾
isRollbackOnly(); // 是否爲只回滾
isCompleted; // 是否已完成
可以發現這個接口描述的是一些處理事務提供簡單的控制事務執行和查詢事務狀態的方法,在回滾或提交的時候需要應用對應的事務狀態。

3 事務的實現方式

3.1 編程式和聲明式事務的區別

Spring提供了編程式事務和聲明式事務兩種實現方式,
編程式事務允許用戶在代碼中精確定義事務的邊界,
而聲明式事務(基於AOP)有助於用戶將操作與事務規則進行解耦。 
簡單地說,編程式事務侵入到了業務代碼裏面,但是提供了更加詳細的事務管理;而聲明式事務由於基於AOP,所以既能起到事務管理的作用,又可以不影響業務代碼的具體實現。

 

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