Spring事務那些事兒

(一)事務的隔離級別

  • 大家都知道事務有四個屬性,即ACID(原子性、一致性、隔離性、持久性)。這四個里面稍微難理解點的是一致性和持久性。所謂的一致性是指:事務執行前后數據的一致性狀態,例如事務執行前用戶有1萬元,事務回滾后用戶仍應該有1萬元。而這里的持久性指的是:事務在提交后結果是永久的,即使程序崩潰數據也能恢復,當然數據庫的持久性指的是高可靠性,事務執行后數據保證一定寫到了磁盤及備份日志,但并不是指高可用性 ,如果你強行把機器的磁盤燒了,那數據也是無法恢復的。
  • 在事務隔離性的基礎上,我們對事務間的相互影響程度進行定級,即事務的隔離級別。通常事務有四種隔離級別:read uncommitted、read committed、repeatable read、serializable。
    (1)read uncommitted是最低的隔離級別,其實就如其英文名一樣,處于這個級別的事務可能會讀到其他事務尚未提交的數據修改,即存在臟讀問題。除此之外,還存在不可重復讀和幻讀問題問題。
    (2)read committed是大部分數據庫的默認隔離級別,它解決了臟讀問題,但是仍存在不可重復讀和幻讀問題。
    (3)repeatable read解決了不可重復讀的問題,但是仍可能存在幻讀的問題。值得一提的是mysql的默認級別是repeatable read,但它卻不存在幻讀問題,因為mysql通過使用next-key lock技術解決了問題,即使在repeatable read級別也能完全保證事務的隔離性要求。
    (4) serializable是最為嚴格的隔離級別,所有事務順序執行,實際上是通過將并行轉為串行來解決事務隔離問題,無疑會降低性能。

不可重復讀和幻讀的區別:
不可重復讀指在同一事務中多次查詢同一記錄(eg:select * from xx where id = 1),查詢結果不一致。這主要是由于多次讀期間其他事務update或delete了記錄。
幻讀是指在同一事務中多次進行范圍查詢(eg:select count(*) from xx where id > 1 and id < 100),查詢結果不一致。這主要是由于多次范圍查詢期間其他事務insert了新數據。

(二)事務的參與者及分類

在一般的事務場景中通常有以下幾個參與者:

  1. RM:用于管理系統數據資源,即通常意義上的數據庫服務器等。
  2. TP monitor:主要用于分布式事務,用來協調處理多個RM的事務處理。
  3. TM:事務的管理者,負責事務界定、事務上下文傳播等功能。
  4. Applacation:運行于容器中的應用程序,例如spring應用程序。

我們通常會根據RM的數量將事務分為分布式事務和局部事務(本地事務)兩種。 在分布式事務中通常會存在多個不同的RM,這些RM分布在不同的系統中,相互之間通過TP monitor協調,利用兩階段提交來保障事務的ACID屬性。在局部事務中一般每次數據操作只有一個RM,數據操作只需操作一個數據庫,在同一個事務中不會進行多個數據庫的更新。接下來我們將著重介紹局部事務的實現,畢竟分布式事務我懂的也不多😜。

(三)局部事務詳解

1.事務原理簡介

首先我們需要了解的很重要的一點是,spring的事務底層實現本質上是依賴于其使用的數據庫服務器,例如mysql數據庫。在mysql數據庫中事務的隔離依賴于mysql的鎖機制,持久性和原子依賴于redo日志,而一致性依賴于undo日志。mysql提供事務功能的具體實現,spring負責界定事務的邊界及定義事務的傳播性,然后通過特定的數據訪問技術(例:jdbc、hibernate等)的API對事務進行管理。
我們以jdbc舉個簡單的例子,我們可以看下面的代碼:

        Connection connection = null;boolean rollback = false;try {connection = dataSource.getConnection();connection.setAutoCommit(false);// 數訪問XXXXXXXXXXXX;connection.commit();} catch (SqlException e) {rollback = true;} finally {if (rollback) {connection.rollback();} else {connection.close();}}

這就是我們利用jdbc進行的最簡單的事務管理,將autoCommit置為false,然后根據各種情況進行事務的回滾提交等操作。而我們平時普通的數據操作都是默認自動提交,mysql會自動隱式的幫我們commit事務。
但是上面的寫法在實際的開發中存在很多的問題:1.不同的數數據訪問技術有不同的api、2.我們需要自己手動捕獲處理各種以sql異常、3.事務管理代碼和數據訪問代碼及業務代碼耦合在一起。

2.spring事務框架重要類

為了解決上面提到的問題,spring為我們提供了優秀的事務框架。我們先來介紹下事務框架中重要的類:

頂層接口職責
TransactionDefinition用來定義事務屬性,包括事務的隔離性、傳播性、超時時間、是否只讀等屬性。
TransactionStatus用來記錄事務開啟到事務結束期間事務的狀態,這個類一般在編程式事務中使用。
PlatformTransactionManagerspring事務框架的核心類,負責事務的管理,包括事務的commit、rollback等。
3.spring事務傳播性
事務傳播性說明
REQUIRED業務方法需要在一個事務中運行,如果方法運行時,已處在一個事務中,那么就加入該事務,否則自己創建一個新的事務,這是spring默認的傳播行為。
SUPPORTS如果業務方法在某個事務范圍內被調用,則方法成為該事務的一部分,如果業務方法在事務范圍外被調用,則方法在沒有事務的環境下執行。
MANDATORY只能在一個已存在事務中執行,業務方法不能發起自己的事務,如果業務方法在沒有事務的環境下調用,就拋異常。
REQUIRES_NEW業務方法總是會為自己發起一個新的事務,如果方法已運行在一個事務中,則原有事務被掛起,新的事務被創建,直到方法結束,新事務才結束,原先的事務才會恢復執行。
NOT_SUPPORTED聲明方法需要事務,如果方法沒有關聯到一個事務,容器不會為它開啟事務。如果方法在一個事務中被調用,該事務會被掛起,在方法調用結束后,原先的事務便會恢復執行。
NEVER聲明方法絕對不能在事務范圍內執行,如果方法在某個事務范圍內執行,容器就拋異常。只有沒關聯到事務,才正常執行。
NESTED如果一個活動的事務存在,則運行在一個嵌套的事務中。如果沒有活動的事務,則按REQUIRED屬性執行。它使用了一個單獨的事務,這個事務擁有多個可以回滾的保證點。內部事務回滾不會對外部事務造成影響, 它只對DataSourceTransactionManager 事務管理器起效。

--------未完待續,敬請期待

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450951.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450951.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450951.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Silverlight Blend動畫設計系列八:拖放(Drag-Drop)操作與拖放行為(DragBehavior)

Silverlight & Blend動畫設計系列八&#xff1a;拖放(Drag-Drop)操作與拖放行為(DragBehavior) 原文:Silverlight & Blend動畫設計系列八&#xff1a;拖放(Drag-Drop)操作與拖放行為(DragBehavior)在Silverlight中自身并沒有提供拖放功能的相關實現&#xff0c;要實現拖…

mysql查詢顯示行號

見&#xff1a;http://blog.csdn.net/muzizhuben/article/details/49449853 使用mysql查詢顯示行號&#xff0c;沒有像oracle這么方便。 不過也可以通過設定變量顯示行號&#xff0c;例如&#xff1a; -- 生成 行號 select r:r1 as rowno , a.* from my_tb a ,(select r:0) b …

scanf 用法大全

關于標準庫函數scanf論壇上很多人對scanf的不太了解&#xff0c;導致程序出錯&#xff0c;我想把scanf的具體用法貼出來&#xff0c;希望大家可以共同進步&#xff0c;有什么不對的地方可以提出來。int scanf(char *format&#xff0c;...);這應該是scanf的標準形式。先說說關于…

深入了解Spring IoC

IoC全稱Inversion of Control即控制反轉&#xff0c;它還有一個別名依賴注入。spring利用Ioc容器幫我們自動構建對象及注入依賴對象&#xff0c;減少了對象構建與業務代碼的耦合&#xff0c;使得我們能夠更加高效愉快的寫bug&#x1f41e;了(&#xffe3;▽&#xffe3;)"…

軟文營銷實戰記錄

最近拜讀了徐茂權老師的《 網絡營銷決勝武器(第2版)》&#xff0c;下面會梳理書中的內容&#xff0c;記錄下以后可能會用到的軟文營銷的技巧。 一、軟文載體 1、平面媒體軟文&#xff1a;報紙、期刊。 2、非正式出版的基于印刷、打印形式載體的軟文&#xff1a;企業印刷的宣傳冊…

oracle中rownum和row_number()的區別

見&#xff1a;http://www.jb51.net/article/65960.htm row_number()over(partition by col1 order by col2)表示根據col1分組&#xff0c;在分組內部根據col2排序&#xff0c;而此函數計算的值就表示每組內部排序后的順序編號&#xff08;組內連續的唯一的&#xff09;。 與ro…

java類加載順序

在java中類的加載、初始化都是在程序運行期完成的&#xff0c;雖然會稍微增加開銷&#xff0c;但是卻很大的增加了靈活性&#xff0c;我們可用在運行期間動態的去網絡或其他地方加載一個二進制流來作為程序代碼的一部分。接下來我們簡單介紹下java類加載過程。 從上圖中我們可…

dealloc不調用的情況

2019獨角獸企業重金招聘Python工程師標準>>> 1、沒有停止定時器 - (void)dealloc { [_timer invalidate]; _timer nil; } 2、VC中有代理Delegate&#xff0c;需要設置delegate的時候&#xff0c;設置為weak property (nonatomic,weak) id<ZoeEatDe…

day10-列表生成式

列表生成式即List Comprehensions&#xff0c;是Python內置的非常簡單卻強大的可以用來創建list的生成式。 1、生成一個列表 a [i for i in range(1,100) if i%21]print(list(a))或print(a)[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, …

jrebel、JavaRebel

見&#xff1a;https://baike.baidu.com/item/jrebel/1115725?fraladdin JRebel是一套JavaEE開發工具。中文名jrebel屬 性JavaEE開發工具資 費收費軟件作 用Jrebel 可快速實現熱部署JRebel是一套JavaEE開發工具。JRebel允許開發團隊在有限的時間內完成更多的任務修正…

自己寫函數庫

大家現在寫 程序&#xff0c;是不是都是用新唐提供的函數庫&#xff1f;在體驗 開發板的一開始&#xff0c;我也是使用函數庫&#xff0c;畢竟這個太方便了。可是有一天&#xff0c;我發現一個只使用時鐘和IO以及 調試 串口的程序居然查過了16k的時候&#xff0c;我震驚了&…

[MicroPython]stm32f407控制DS18B20檢測溫度

2019獨角獸企業重金招聘Python工程師標準>>> 1.實驗目的 1. 學習在PC機系統中擴展簡單I/O 接口的方法。 2. 進一步學習編制數據輸出程序的設計方法。 3. 學習DS18B20的接線方法&#xff0c;并利用DS18B20檢測當前溫度。 2.所需元器件 F407Micropython開發板…

帶你理解Spring AOP

AOP概述 在我們的日常開發中&#xff0c;除了正常業務邏輯外&#xff0c;還可能經常會需要在業務邏輯的特定位置加入日志&#xff0c;以便于調試和問題分析。但是這種插入日志的邏輯和業務邏輯間并不存在連續性和依賴性&#xff0c;這種邏輯侵入隨著項目的不斷發展&#xff0c…

10.20隨筆

ES6 ECMAScript是一種由Ecma國際&#xff08;前身為歐洲計算機制造商協會,英文名稱是European Computer Manufacturers Association&#xff09;通過ECMA-262標準化的腳本程序設計語言。 這種語言在萬維網上應用廣泛&#xff0c;它往往被稱為JavaScript或JScript&#xff0c;但…

極客招募令!兄弟杯區塊鏈極客競技大賽在上海等您來戰!

據悉&#xff0c;由國內首家區塊鏈技術社區區塊鏈兄弟主辦&#xff0c;旺鏈科技、離子鏈、中國云體系產業創新戰略聯盟、無退社區、指旺金科等單位強力支持&#xff0c;HiBlock區塊鏈社區、火球財經、布洛克財經、海豚區塊鏈、區塊網等百家技術社區和媒體通力合作的兄弟杯區塊鏈…

Java中Web程序修改配置文件不重啟服務器的方法

見&#xff1a;http://blog.sina.com.cn/s/blog_69398ed9010191jg.html 另&#xff1a;http://ekisstherain.iteye.com/blog/1701463 jrebel 、JavaRebel是什么&#xff0c;見另一博客&#xff1a;jrebel/JavaRebel 開發環境 1. JDK 2. MyEclipse 3. Tomcat 4. Struts2 5.…

ffmpeg-0.6.3 移植到 windows 開源代碼

ffmpeg-0.6.3開源編碼解碼庫&#xff0c;從linux下移植到windows vs2005&#xff0c;全部開源。 需要 Intel C Compile 和 開源的SDL庫支持&#xff0c;由于 Intel C Compile支持C99語法&#xff0c;所以源代碼改動很小很小。 主要的修改 1&#xff1a;添加了linux中有而wind…

一起嘮嘮分布式鎖

&#xff08;1&#xff09;分布式鎖和分布式事務的區別 1.分布式鎖是在集群環境下&#xff0c;用來控制不同機器對全局共享資源的訪問。 2.分布式事務是在集群環境下&#xff0c;用來保證全局事務的一致性&#xff0c;保證多個數據庫的數據整體上能正確的從一個一致性狀態轉到…

luogu2577/bzoj1899 午餐 (貪心+dp)

首先&#xff0c;應該盡量讓吃飯慢的排在前面&#xff0c;先按這個排個序 然后再來決定每個人到底去哪邊 設f[i][j]是做到了第i個人&#xff0c;然后1號窗口目前的總排隊時間是j&#xff0c;目前的最大總時間 有這個i和j的話&#xff0c;再預處理出前i個人的排隊總時間sum[i]&a…

wpf中xps文檔合并功能實現

原文:wpf中xps文檔合并功能實現跟著上一篇的xps文檔套打的文章&#xff0c;近期一直在研究xps打印技術&#xff0c;其中用戶提到了一個需求&#xff0c;要求能夠多頁面進行打印&#xff0c;我的想法是&#xff0c;先生成xps文件&#xff0c;然后將文件讀取出來以后&#xff0c;…