Java面試題2.0--spring事務

 
 

歡迎關注《Java面試題2.0》合集發佈頁,持續更新中!

 
 
spring事務定義
 
1.事務的定義:事務是指多個操作單元組成的合集,多個單元操作是整體不可分割的,要麼都操作不成功,要麼都成功。其必須遵循四個原則(ACID)。
 
原子性(Atomicity):即事務是不可分割的最小工作單元,事務內的操作要麼全做,要麼全不做;
 
一致性(Consistency):在事務執行前數據庫的數據處於正確的狀態,而事務執行完成後數據庫的數據還是應該處於正確的狀態,即數據完整性約束沒有被破壞;如銀行轉帳,A轉帳給B,必須保證A的錢一定轉給B,一定不會出現A的錢轉了但B沒收到,否則數據庫的數據就處於不一致(不正確)的狀態。
 
隔離性(Isolation):併發事務執行之間互不影響,在一個事務內部的操作對其他事務是不產生影響,這需要事務隔離級別來指定隔離性;
 
持久性(Durability):事務一旦執行成功,它對數據庫的數據的改變必須是永久的,不會因比如遇到系統故障或斷電造成數據不一致或丟失。
 
Spring管理事務有幾種方式?具體執行流程以及原理
 
答:有兩種方式:
1、編程式事務,在代碼中硬編碼。(不推薦使用)
2、聲明式事務,在配置文件中配置(推薦使用)
 
聲明式事務又分爲兩種:
a、基於XML的聲明式事務
b、基於註解的聲明式事務
 
Spring框架的事務管理有哪些優點?
 
它爲不同的事務API 如 JTA,JDBC,Hibernate,JPA 和JDO,提供一個不變的編程模式。
它爲編程式事務管理提供了一套簡單的API而不是一些複雜的事務API如
它支持聲明式事務管理。
它和Spring各種數據訪問抽象層很好得集成。
 
Spring事務隔離級別:
 
spring有五大隔離級別,其在TransactionDefinition接口中定義。看源碼可知,其默isolation_default(底層數據庫默認級別),其他四個隔離級別跟數據庫隔離級別一致。
 
ISOLATION_DEFAULT:用底層數據庫的默認隔離級別,數據庫管理員設置什麼就是什麼
ISOLATION_READ_UNCOMMITTED(未提交讀):最低隔離級別、事務未提交前,就可被其他事務讀取(會出現幻讀、髒讀、不可重複讀)
ISOLATION_READ_COMMITTED(提交讀):一個事務提交後才能被其他事務讀取到(該隔離級別禁止其他事務讀取到未提交事務的數據、所以還是會造成幻讀、不可重複讀)、sql server默認級別
 
ISOLATION_REPEATABLE_READ(可重複讀):可重複讀,保證多次讀取同一個數據時,其值都和事務開始時候的內容是一致,禁止讀取到別的事務未提交的數據(該隔離基本可防止髒讀,不可重複讀(重點在修改),但會出現幻讀(重點在增加與刪除))(MySql默認級別,更改可通過set transaction isolation level 級別)
 
ISOLATION_SERIALIZABLE(序列化):代價最高最可靠的隔離級別(該隔離級別能防止髒讀、不可重複讀、幻讀)
丟失更新:兩個事務同時更新一行數據,最後一個事務的更新會覆蓋掉第一個事務的更新,從而導致第一個事務更新的數據丟失,這是由於沒有加鎖造成的;
幻讀:同樣的事務操作過程中,不同時間段多次(不同事務)讀取同一數據,讀取到的內容不一致(一般是行數變多或變少)。
 
髒讀:一個事務讀取到另外一個未提及事務的內容,即爲髒讀。
不可重複讀:同一事務中,多次讀取內容不一致(一般行數不變,而內容變了)。
 
你更傾向用那種事務管理類型?
 
大多數Spring框架的用戶選擇聲明式事務管理,因爲它對應用代碼的影響最小,因此更符合一個無侵入的輕量級容器的思想。聲明式事務管理要優於編程式事務管理,雖然比編程式事務管理(這種方式允許你通過代碼控制事務)少了一點靈活性。
 
spring的事務傳播行爲:
spring事務的傳播行爲說的是當一個方法調用另一個方法時,事務該如何操作。
(1)PROPAGATION_REQUIRED:如果當前沒有事務,就創建一個新事務,如果當前存在事務,就加入該事務,該設置是最常用的設置。
(2)PROPAGATION_SUPPORTS:支持當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就以非事務執行。‘
(3)PROPAGATION_MANDATORY:支持當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就拋出異常。
(4)PROPAGATION_REQUIRES_NEW:創建新事務,無論當前存不存在事務,都創建新事務。
(5)PROPAGATION_NOT_SUPPORTED:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
(6)PROPAGATION_NEVER:以非事務方式執行,如果當前存在事務,則拋出異常。
(7)PROPAGATION_NESTED:如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類似的操作。
 
Spring事務的實現方式和實現原理:
 
(1)劃分處理單元——IOC:
由於spring解決的問題是對單個數據庫進行局部事務處理的,具體的實現首相用spring中的IOC劃分了事務處理單元。並且將對事務的各種配置放到了ioc容器中(設置事務管理器,設置事務的傳播特性及隔離機制)。
 
(2)AOP攔截需要進行事務處理的類:
Spring事務處理模塊是通過AOP功能來實現聲明式事務處理的,具體操作(比如事務實行的配置和讀取,事務對象的抽象),用TransactionProxyFactoryBean接口來使用AOP功能,生成proxy代理對象,通過TransactionInterceptor完成對代理方法的攔截,將事務處理的功能編織到攔截的方法中。
 
讀取ioc容器事務配置屬性,轉化爲spring事務處理需要的內部數據結構(TransactionAttributeSourceAdvisor),轉化爲TransactionAttribute表示的數據對象。
 
(3)對事物處理實現(事務的生成、提交、回滾、掛起):
spring委託給具體的事務處理器實現。實現了一個抽象和適配。適配的具體事務處理器:DataSource數據源支持、hibernate數據源事務處理支持、JDO數據源事務處理支持,JPA、JTA數據源事務處理支持。這些支持都是通過設計PlatformTransactionManager、AbstractPlatforTransaction一系列事務處理的支持。爲常用數據源支持提供了一系列的TransactionManager。
 
(4)結合:
PlatformTransactionManager實現了TransactionInterception接口,讓其與TransactionProxyFactoryBean結合起來,形成一個Spring聲明式事務處理的設計體系。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章