溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

spring相關(guān)知識點和面試內(nèi)容有哪些

發(fā)布時間:2022-01-15 16:16:50 來源:億速云 閱讀:157 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要講解了“spring相關(guān)知識點和面試內(nèi)容有哪些”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“spring相關(guān)知識點和面試內(nèi)容有哪些”吧!

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

spring相關(guān)知識點和面試內(nèi)容有哪些

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

  • status.hasSavepoint()如果status中有savePoint,只回滾到savePoint!

  • status.isNewTransaction()如果status是一個新事務(wù),才會真正去回滾!

  • status.hasTransaction()如果status有事務(wù),將會對staus中的事務(wù)標記!

2 核心接口

Spring事務(wù)管理的實現(xiàn)有許多細節(jié),如果對整個接口框架有個大體了解會非常有利于我們理解事務(wù),下面通過講解Spring的事務(wù)接口來了解Spring實現(xiàn)事務(wù)的具體策略。 

Spring事務(wù)管理涉及的接口的聯(lián)系如下:

spring相關(guān)知識點和面試內(nèi)容有哪些

spring相關(guān)知識點和面試內(nèi)容有哪些

2.1 平臺事務(wù)管理器(PlatformTransactionManager)

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>

2.2 基礎(chǔ)事務(wù)屬性定義(TransactionDefinition)

上面講到的事務(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ù)屬性。

2.2.1 傳播行為

事務(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是使用最頻繁的一個。

2.2.2 隔離級別

事務(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

2.2.3 只讀

事務(wù)的第三個特性是它是否為只讀事務(wù)。

如果事務(wù)只對后端的數(shù)據(jù)庫進行該操作,數(shù)據(jù)庫可以利用事務(wù)的只讀特性來進行一些特定的優(yōu)化。

通過將事務(wù)設(shè)置為只讀,你就可以給數(shù)據(jù)庫一個機會,讓它應(yīng)用它認為合適的優(yōu)化措施。

2.2.4 事務(wù)超時

為了使應(yīng)用程序很好地運行,事務(wù)不能運行太長的時間。

因為事務(wù)可能涉及對后端數(shù)據(jù)庫的鎖定,所以長時間的事務(wù)會不必要的占用數(shù)據(jù)庫資源。

事務(wù)超時就是事務(wù)的一個定時器,在特定時間內(nèi)事務(wù)如果沒有執(zhí)行完畢,那么就會自動回滾,而不是一直等待其結(jié)束。

2.2.5 回滾規(guī)則

事務(wù)五邊形的最后一個方面是一組規(guī)則,這些規(guī)則定義了哪些異常會導致事務(wù)回滾而哪些不會。

默認情況下,事務(wù)只有遇到運行期異常時才會回滾,而在遇到檢查型異常時不會回滾(這一行為與EJB的回滾行為是一致的) 

但是你可以聲明事務(wù)在遇到特定的檢查型異常時像遇到運行期異常那樣回滾。同樣,你還可以聲明事務(wù)遇到特定的異常不回滾,即使這些異常是運行期異常。

2.3 事務(wù)狀態(tài)

上面講到的調(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)。

3 事務(wù)的實現(xiàn)方式

3.1 編程式和聲明式事務(wù)的區(qū)別

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)注!

向AI問一下細節(jié)

免責聲明:本站發(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)容。

AI