spring的事務隔離級別

1. TransactionDefinition接口中定義五個隔離級別:

ISOLATION_DEFAULT 這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別.另外四個與JDBC的隔離級別相對應;

ISOLATION_READ_UNCOMMITTED 這是事務最低的隔離級別,它充許別外一個事務可以看到這個事務未提交的數據。這種隔離級別會產生臟讀,不可重復讀和幻像讀。

ISOLATION_READ_COMMITTED 保證一個事務修改的數據提交后才能被另外一個事務讀取。另外一個事務不能讀取該事務未提交的數據。這種事務隔離級別可以避免臟讀出現,但是可能會出現不可重復讀和幻像讀。

ISOLATION_REPEATABLE_READ 這種事務隔離級別可以防止臟讀,不可重復讀。但是可能出現幻像讀。它除了保證一個事務不能讀取另一個事務未提交的數據外,還保證了避免下面的情況產生(不可重復讀)。

ISOLATION_SERIALIZABLE 這是花費最高代價但是最可靠的事務隔離級別。事務被處理為順序執行。除了防止臟讀,不可重復讀外,還避免了幻像讀。

2. 什么是臟讀,不可重復讀和幻像

Dirty reads(臟讀)。也就是說,比如事務A的未提交(還依然緩存)的數據被事務B讀走,如果事務A失敗回滾,會導致事務B所讀取的的數據是錯誤的。

non-repeatable reads(數據不可重復讀)。比如事務A中兩處讀取數據-total-的值。在第一讀的時候,total是100,然后事務B就把total的數據改成 200,事務A再讀一次,結果就發現,total竟然就變成200了,造成事務A數據混亂。

phantom reads(幻象讀數據),這個和non-repeatable reads相似,也是同一個事務中多次讀不一致的問題。但是non-repeatable reads的不一致是因為他所要取的數據集被改變了(比如total的數據),但是phantom reads所要讀的數據的不一致卻不是他所要讀的數據集改變,而是他的條件數據集改變。比如Select account.id where account.name=”ppgogo*”,第一次讀去了6個符合條件的id,第二次讀取的時候,由于事務b把一個帳號的名字由”dd”改成”ppgogo1”,結果取出來了7個數據。

3. 在TransactionDefinition接口中定義了七個事務傳播行為:

1)?PROPAGATION_REQUIRED 如果存在一個事務,則支持當前事務。如果沒有事務則開啟一個新的事務。這是我們使用最多的事務傳播行為?

例如方法A中調用方法B,如果在調用A時沒有事務則開啟一個事務,而對于B則會加入到A的事務中。?

使用spring聲明式事務,spring使用AOP來支持聲明式事務,會根據事務屬性,自動在方法調用之前決定是否開啟一個事務,并在方法執行之后決定事務提交或回滾事務.

2)PROPAGATION_SUPPORTS 如果存在一個事務,支持當前事務。如果沒有事務,則非事務的執行。但是對于事務同步的事務管理器,PROPAGATION_SUPPORTS與不使用事務有少許不同。

3)PROPAGATION_MANDATORY 如果已經存在一個事務,支持當前事務。如果沒有一個活動的事務,則拋出異常throw new IllegalTransactionStateException(“Transaction propagation ‘mandatory’ but no existing transaction found”);。

4)PROPAGATION_REQUIRES_NEW 總是開啟一個新的事務。如果一個事務已經存在,則將這個存在的事務掛起。使用PROPAGATION_REQUIRES_NEW,需要使用 JtaTransactionManager作為事務管理器。

5)PROPAGATION_NOT_SUPPORTED 總是非事務地執行,并掛起任何存在的事務。使用PROPAGATION_NOT_SUPPORTED,也需要使用JtaTransactionManager作為事務管理器。

6)PROPAGATION_NEVER 總是非事務地執行,如果存在一個活動事務,則拋出異常;

7)PROPAGATION_NESTED如果一個活動的事務存在,則運行在一個嵌套的事務中. 如果沒有活動事務, 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執行。這是一個嵌套事務,使用JDBC 3.0驅動時,僅僅支持DataSourceTransactionManager作為事務管理器。需要JDBC 驅動的java.sql.Savepoint類。有一些JTA的事務管理器實現可能也提供了同樣的功能。使用PROPAGATION_NESTED,還需要把PlatformTransactionManager的nestedTransactionAllowed屬性設為true;而 nestedTransactionAllowed屬性值默認為false;

4.Spring事務管理的優勢在哪

使用JDBC的時候開啟事務使用Connection,而使用Hibernate時開啟事務使用的是Session。所以如果我們使用傳統的事務編程策略時,程序代碼必須和具體的事務操作代碼耦合。這樣在不同的事務策略之間切換時開發者必須手動改代碼。而如果使用Spring來管理事務則不會出現這種情況。

5.Spring如何管理事務(典型的策略模式)

Spring事務策略是通過PlatformTransactionManager接口實現的,它是整個Spring事務的核心。它是對事務策略的一個高度抽象,不依賴于任何具體的事務策略,而對于底層的具體的事務策略它相應的有不同的實現類。而對于不同的事務策略的切換通常由Spring容器來負責管理,應用程序既無須與具體的事務API耦合,也無須與特定的實現類耦合而將應用和持久化技術,事務API徹底分離開來。

6.Spring管理事務的幾個核心類

Spring事務管理的策略模式體現在哪?PlatformTransactionManager代表事務管理接口,但它并不知道底層到底如何管理事務的,而它只要求事務管理提供開始事務(getTransaction(TransactionDefinition definition)),提交事務(commit())和回滾事務(rollback())三個方法,具體的實現交給子類來完成。

源碼:

publicinterfacePlatformTransactionManager{//獲得事務TransactionStatus? getTransaction(TransactionDefinition definition)throwsTransactionException;//事務提交voidcommit(TransactionStatus status)throwsTransactionException;//事務回滾voidrollback(TransactionStatus status)throwsTransactionException ;}

在核心接口PlatformTransactionManager中,方法getTransaction(TransactionDefinition definition)中它接受一個TransactionDefinition對象返回一個TransactionStatus。TransactionStatus對象表示一個事務,被關聯在當前執行的線程上。返回的事務可以是個新事務,也可以是個已經存在的事務對象

TransactionDefinition接口必須指定如下的幾個屬性值:

事務隔離

事務傳播

事務超時(即事務最長持續時間)

只讀狀態(Hibernate很有用的優化)

TransactionStatus:代表事務本身,它提供了通用的事務管理如控制事務的執行和查詢事務狀態的方法。?

源碼:

publicinterfaceTransactionStatus{booleanisNewTransaction();//是否為新建事務voidsetRollbackOnly();//設置事務回滾booleanisRollBackOnly();//查詢事務是否已有回滾標志}

幾個類之間的關系:?

7.Spring對不同的持久化技術提供的不同實現類

Spring具體的事務管理由PlatformTransactionManager的不同實現類來完成,在Spring容器中配置PlatformTransactionManager Bean時,必須針對不同的環境來配置不同的實現類。

下面分別展示了在JDBC和Hibernate中配置PlatformTransactionManager對應的實現類。?

JDBC

Hibernate

8.使用XML Schema配置事務策略

對于Spring通過的兩種事務管理。編程式的事務管理程序直接從容器中獲取transactionManager Bean,該Bean總是PlatformTransactionManager的實例,所以可以使用它的三個方法來管理事務。而對于聲明式事務管理只需要要在XML配置文件中配置事務代理即可,在目標方法中開發者無需編寫額外的代碼,不依賴Spring或任何其他事務的API。

Spring提供了tx:命名空間來配置事務管理,tx:下的配置事務增強處理,最后使用元素啟用自動代理。?

元素除了需要transaction-manager之外,還需要子元素,該子元素包含多個子元素,用來配置事務的屬性。?

的重要屬性:

propagation:事務傳播行為 默認是REQUIRED

isolation:事務隔離級別?

timeout:超時時間

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,238評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,823評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,604評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,339評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,713評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評論 3 445
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,893評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,448評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,201評論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,397評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,631評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,033評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,321評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,128評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,347評論 2 377

推薦閱讀更多精彩內容

  • Spring 事務屬性分析 事務管理對于企業應用而言至關重要。它保證了用戶的每一次操作都是可靠的,即便出現了異常的...
    壹點零閱讀 1,311評論 0 2
  • 很多人喜歡這篇文章,特此同步過來 由淺入深談論spring事務 前言 這篇其實也要歸納到《常識》系列中,但這重點又...
    碼農戲碼閱讀 4,760評論 2 59
  • 事務的嵌套概念 所謂事務的嵌套就是兩個事務方法之間相互調用。spring事務開啟 ,或者是基于接口的或者是基于類的...
    jackcooper閱讀 1,437評論 0 10
  • 事務有四個特性:ACID 原子性(Atomicity):事務是一個原子操作,由一系列動作組成。事務的原子性確保動作...
    jiangmo閱讀 1,247評論 0 7
  • flux架構被Facebook使用來構建他們的客戶端web應用,無意中看到一篇文章介紹這個架構,剛好也準備做一個新...
    自然心情閱讀 1,975評論 0 11