您好,登錄后才能下訂單哦!
這篇文章主要講解了“spring相關(guān)知識點和面試內(nèi)容有哪些”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“spring相關(guān)知識點和面試內(nèi)容有哪些”吧!
sping事務(wù)只對RuntimeException和Error類型的異常生效 不對checked exceptions生效 就是try catch捕獲的異常
事務(wù)回滾的流程 捕獲異常 判斷異常類型 如果是RuntimeException和Error就進行roll back操作
status.hasSavepoint()如果status中有savePoint,只回滾到savePoint!
status.isNewTransaction()如果status是一個新事務(wù),才會真正去回滾!
status.hasTransaction()如果status有事務(wù),將會對staus中的事務(wù)標記!
Spring事務(wù)管理的實現(xiàn)有許多細節(jié),如果對整個接口框架有個大體了解會非常有利于我們理解事務(wù),下面通過講解Spring的事務(wù)接口來了解Spring實現(xiàn)事務(wù)的具體策略。
Spring事務(wù)管理涉及的接口的聯(lián)系如下:
Spring并不直接管理事務(wù),而是提供了多種事務(wù)管理器,他們將事務(wù)管理的職責委托給Hibernate或者JTA等持久化機制所提供的相關(guān)平臺框架的事務(wù)來實現(xiàn)。
Spring事務(wù)管理器的接口是org.springframework.transaction.PlatformTransactionManager,
通過這個接口,Spring為各個平臺如JDBC、Hibernate等都提供了對應(yīng)的事務(wù)管理器,但是具體的實現(xiàn)就是各個平臺自己的事情了。
PlatformTransactionManager接口的內(nèi)容如上圖:
主要定義了
getTransaction(TransactionDefinition definition) //獲取事務(wù),
commit() //提交,
rollback() //回滾
方法。
而具體實現(xiàn),我們常用的有:
DataSourceTransactionManager:使用jdbc來進行數(shù)據(jù)庫操作時,對事務(wù)進行管理,
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean>
HibernateTransactionManager:使用hibernate進行操作時,對事務(wù)進行管理。
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean>
上面講到的事務(wù)管理器接口PlatformTransactionManager通過getTransaction(TransactionDefinition definition)方法
傳入事務(wù)屬性定義來得到事務(wù),
這個方法里面的參數(shù)是TransactionDefinition類,這個類就定義了一些基本的事務(wù)屬性。
那么什么是事務(wù)屬性呢?
事務(wù)屬性可以理解成事務(wù)的一些基本配置,描述了事務(wù)策略如何應(yīng)用到方法上。事務(wù)屬性包含了5個方面
TransactionDefinition接口的內(nèi)容:
主要定義了
getPropagationBehavior() //獲取事務(wù)傳播行為,
getIsolationLevel() //獲取事務(wù)隔離級別,
getTimeout() //獲取超時時間,
isReadOnly() //事務(wù)是否只讀
我們可以發(fā)現(xiàn)TransactionDefinition正好用來定義事務(wù)屬性,下面詳細介紹一下各個事務(wù)屬性。
事務(wù)的第一個方面是傳播行為(propagation behavior)。
當事務(wù)方法被另一個事務(wù)方法調(diào)用時,必須指定事務(wù)應(yīng)該如何傳播。
Spring定義了七種傳播行為:
傳播行為 | 含義 |
PROPAGATION_REQUIRED | 表示當前方法必須運行在事務(wù)中。如果當前事務(wù)存在,方法將會在該事務(wù)中運行。否則,會啟動一個新的事務(wù) |
PROPAGATION_SUPPORTS | 表示當前方法不需要事務(wù)上下文,但是如果存在當前事務(wù)的話,那么該方法會在這個事務(wù)中運行 |
PROPAGATION_MANDATORY | 表示該方法必須在事務(wù)中運行,如果當前事務(wù)不存在,則會拋出一個異常 |
PROPAGATION_REQUIRED_NEW | 表示當前方法必須運行在它自己的事務(wù)中。一個新的事務(wù)將被啟動。如果存在當前事務(wù),在該方法執(zhí)行期間,當前事務(wù)會被掛起。如果使用JTATransactionManager的話,則需要訪問TransactionManager |
PROPAGATION_NOT_SUPPORTED | 表示該方法不應(yīng)該運行在事務(wù)中。如果存在當前事務(wù),在該方法運行期間,當前事務(wù)將被掛起。如果使用JTATransactionManager的話,則需要訪問TransactionManager |
PROPAGATION_NEVER | 表示當前方法不應(yīng)該運行在事務(wù)上下文中。如果當前正有一個事務(wù)在運行,則會拋出異常 |
PROPAGATION_NESTED | 表示如果當前已經(jīng)存在一個事務(wù),那么該方法將會在嵌套事務(wù)中運行。嵌套的事務(wù)可以獨立于當前事務(wù)進行單獨地提交或回滾。如果當前事務(wù)不存在,那么其行為與PROPAGATION_REQUIRED一樣。注意各廠商對這種傳播行為的支持是有所差異的。可以參考資源管理器的文檔來確認它們是否支持嵌套事務(wù) |
可以看到以上有七種事務(wù)傳播行為,經(jīng)常使用到的為標注了紅色的三種。REQUIRED是使用最頻繁的一個。
事務(wù)的第二個維度就是隔離級別(isolation level)。
隔離級別定義了一個事務(wù)可能受其他并發(fā)事務(wù)影響的程度。
Spring定義了五種隔離級別:
隔離級別 | 含義 |
ISOLATION_DEFAULT | 使用后端數(shù)據(jù)庫默認的隔離級別 |
ISOLATION_READ_UNCOMMITTED | 最低的隔離級別,允許讀取尚未提交的數(shù)據(jù)變更,可能會導致臟讀、幻讀或不可重復讀 |
ISOLATION_READ_COMMITTED | 允許讀取并發(fā)事務(wù)已經(jīng)提交的數(shù)據(jù),可以阻止臟讀,但是幻讀或不可重復讀仍有可能發(fā)生 |
ISOLATION_REPEATABLE_READ | 對同一字段的多次讀取結(jié)果都是一致的,除非數(shù)據(jù)是被本身事務(wù)自己所修改,可以阻止臟讀和不可重復讀,但幻讀仍有可能發(fā)生 |
ISOLATION_SERIALIZABLE | 最高的隔離級別,完全服從ACID的隔離級別,確保阻止臟讀、不可重復讀以及幻讀,也是最慢的事務(wù)隔離級別,因為它通常是通過完全鎖定事務(wù)相關(guān)的數(shù)據(jù)庫表來實現(xiàn)的 |
Spring中,默認使用DEFAULT,即當前連接池中使用的數(shù)據(jù)庫的隔離級別。
Oracle默認的隔離級別為:READ_COMMITTED
Mysql默認的隔離級別為:REPEATABLE_READ
事務(wù)的第三個特性是它是否為只讀事務(wù)。
如果事務(wù)只對后端的數(shù)據(jù)庫進行該操作,數(shù)據(jù)庫可以利用事務(wù)的只讀特性來進行一些特定的優(yōu)化。
通過將事務(wù)設(shè)置為只讀,你就可以給數(shù)據(jù)庫一個機會,讓它應(yīng)用它認為合適的優(yōu)化措施。
為了使應(yīng)用程序很好地運行,事務(wù)不能運行太長的時間。
因為事務(wù)可能涉及對后端數(shù)據(jù)庫的鎖定,所以長時間的事務(wù)會不必要的占用數(shù)據(jù)庫資源。
事務(wù)超時就是事務(wù)的一個定時器,在特定時間內(nèi)事務(wù)如果沒有執(zhí)行完畢,那么就會自動回滾,而不是一直等待其結(jié)束。
事務(wù)五邊形的最后一個方面是一組規(guī)則,這些規(guī)則定義了哪些異常會導致事務(wù)回滾而哪些不會。
默認情況下,事務(wù)只有遇到運行期異常時才會回滾,而在遇到檢查型異常時不會回滾(這一行為與EJB的回滾行為是一致的)
但是你可以聲明事務(wù)在遇到特定的檢查型異常時像遇到運行期異常那樣回滾。同樣,你還可以聲明事務(wù)遇到特定的異常不回滾,即使這些異常是運行期異常。
上面講到的調(diào)用PlatformTransactionManager接口的getTransaction()的方法得到的是TransactionStatus接口的一個實現(xiàn)。
TransactionStatus接口的內(nèi)容如上圖:
主要定義了
isNewTransaction(); // 是否是新的事物
hasSavepoint(); // 是否有恢復點
setRollbackOnly(); // 設(shè)置為只回滾
isRollbackOnly(); // 是否為只回滾
isCompleted; // 是否已完成
可以發(fā)現(xiàn)這個接口描述的是一些處理事務(wù)提供簡單的控制事務(wù)執(zhí)行和查詢事務(wù)狀態(tài)的方法,在回滾或提交的時候需要應(yīng)用對應(yīng)的事務(wù)狀態(tài)。
Spring提供了編程式事務(wù)和聲明式事務(wù)兩種實現(xiàn)方式,
編程式事務(wù)允許用戶在代碼中精確定義事務(wù)的邊界,
而聲明式事務(wù)(基于AOP)有助于用戶將操作與事務(wù)規(guī)則進行解耦。
簡單地說,編程式事務(wù)侵入到了業(yè)務(wù)代碼里面,但是提供了更加詳細的事務(wù)管理;而聲明式事務(wù)由于基于AOP,所以既能起到事務(wù)管理的作用,又可以不影響業(yè)務(wù)代碼的具體實現(xiàn)。
感謝各位的閱讀,以上就是“spring相關(guān)知識點和面試內(nèi)容有哪些”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對spring相關(guān)知識點和面試內(nèi)容有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。