1. 程式人生 > >Spring 事務機制詳解

Spring 事務機制詳解

Spring事務機制主要包括宣告式事務和程式設計式事務,此處側重講解宣告式事務,程式設計式事務在實際開發中得不到廣泛使用,僅供學習參考。

Spring宣告式事務讓我們從複雜的事務處理中得到解脫。使得我們再也無需要去處理獲得連線、關閉連線、事務提交和回滾等這些操作。再也無需要我們在與事務相關的方法中處理大量的try…catch…finally程式碼。我們在使用Spring宣告式事務時,有一個非常重要的概念就是事務屬性。事務屬性通常由事務的傳播行為,事務的隔離級別,事務的超時值和事務只讀標誌組成。我們在進行事務劃分時,需要進行事務定義,也就是配置事務的屬性。

下面分別詳細講解,事務的四種屬性,僅供諸位學習參考:

Spring在TransactionDefinition介面中定義這些屬性,以供PlatfromTransactionManager使用, PlatfromTransactionManager是spring事務管理的核心介面。

123456public interface TransactionDefinition {int getPropagationBehavior();//返回事務的傳播行為。int getIsolationLevel();//返回事務的隔離級別,事務管理器根據它來控制另外一個事務可以看到本事務內的哪些資料。int getTimeout();//返回事務必須在多少秒內完成。boolean
 isReadOnly();//事務是否只讀,事務管理器能夠根據這個返回值進行優化,確保事務是隻讀的。}

1. TransactionDefinition介面中定義五個隔離級別:

ISOLATION_DEFAULT 這是一個PlatfromTransactionManager預設的隔離級別,使用資料庫預設的事務隔離級別.另外四個與JDBC的隔離級別相對應;

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

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

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

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

1: Dirty reads(髒讀)。也就是說,比如事務A的未提交(還依然快取)的資料被事務B讀走,如果事務A失敗回滾,會導致事務B所讀取的的資料是錯誤的。
2: non-repeatable reads(資料不可重複讀)。比如事務A中兩處讀取資料-total-的值。在第一讀的時候,total是100,然後事務B就把total的資料改成200,事務A再讀一次,結果就發現,total竟然就變成200了,造成事務A資料混亂。
3: phantom reads(幻象讀資料),這個和non-repeatable reads相似,也是同一個事務中多次讀不一致的問題。但是non-repeatable reads的不一致是因為他所要取的資料集被改變了(比如total的資料),但是phantom reads所要讀的資料的不一致卻不是他所要讀的資料集改變,而是他的條件資料集改變。比如Select account.id where account.name=”ppgogo*”,第一次讀去了6個符合條件的id,第二次讀取的時候,由於事務b把一個帳號的名字由”dd”改成”ppgogo1″,結果取出來了7個數據。

2. 在TransactionDefinition介面中定義了七個事務傳播行為:

(1)PROPAGATION_REQUIRED 如果存在一個事務,則支援當前事務。如果沒有事務則開啟一個新的事務。

Java程式碼:

1234567891011//事務屬性 PROPAGATION_REQUIRED methodA{ …… methodB(); …… }//事務屬性 PROPAGATION_REQUIRED methodB{ …… }

使用spring宣告式事務,spring使用AOP來支援宣告式事務,會根據事務屬性,自動在方法呼叫之前決定是否開啟一個事務,並在方法執行之後決定事務提交或回滾事務。

單獨呼叫methodB方法:

Java程式碼

12345main{ metodB(); }

相當於

Java程式碼

12345678910111213141516171819202122232425262728293031323334353637Main{ Connection con=null; try{ con = getConnection(); con.setAutoCommit(false); //方法呼叫methodB(); //提交事務con.commit(); } Catch(RuntimeException ex){ //回滾事務con.rollback();   } finally{ //釋放資源closeCon(); } }

Spring保證在methodB方法中所有的呼叫都獲得到一個相同的連線。在呼叫methodB時,沒有一個存在的事務,所以獲得一個新的連線,開啟了一個新的事務。

單獨呼叫MethodA時,在MethodA內又會呼叫MethodB.

執行效果相當於:

Java程式碼

12345678910111213141516171819

相關推薦

Spring 事務機制

Spring事務機制主要包括宣告式事務和程式設計式事務,此處側重講解宣告式事務,程式設計式事務在實際開發中得不到廣泛使用,僅供學習參考。Spring宣告式事務讓我們從複雜的事務處理中得到解脫。使得我們再也無需要去處理獲得連線、關閉連線、事務提交和回滾等這些操作。再也無需要我們

Spring5原始碼分析系列(九)Spring事務原理

終於等到了B站的薪資溝通電話,美滋滋,本節開始進入Spring資料訪問篇,講解spring事務,文章參考自Tom老師視訊。 事務基本概念 事務(Transaction)是訪問並可能更新資料庫中各種資料項的一個程式執行單元(unit)。 特點: 事務是恢復和併發控制的基

spring事務管理(和例項)

原文地址: 寫這篇部落格之前我首先讀了《Spring in action》,之後在網上看了一些關於Spring事務管理的文章,感覺都沒有講全,這裡就將書上的和網上關於事務的知識總結一下,參考的文章如下: 1 初步理解 理解事務之前,先講一個你日常生活中最常乾的事:取

Spring 事務管理

事務的概念 我們知道,在JavaEE的開發過程中,service方法用於處理主要的業務邏輯,而業務邏輯的處理往往伴隨著對資料庫的多個操作。以我們生活中常見的轉賬為例,service方法要實現將A賬戶轉賬到B賬戶的功能,則該方法內必定要有兩個操作:先將A賬戶的金額減去要轉賬的數目,然後將B賬戶加上相應的金額數

Spring 事務原理

事務(Transaction)是訪問並可能更新資料庫中各種資料項的一個程式執行單元(unit)。 特點 事務是恢復和併發控制的基本單位。 事務應該具有4個屬性:原子性、一致性、隔離性、持續性。這四個屬性通常稱為ACID特性。 原子性(atomicity)。一個事務是一個不可分割的工作單位,事務中包括

可能是最漂亮的Spring事務管理

事務概念回顧 什麼是事務? 事務是邏輯上的一組操作,要麼都執行,要麼都不執行. 事物的特性(ACID): 原子性: 事務是最小的執行單位,不允許分割。事務的原子性確保動作要麼全部完成,要麼完全不起作用; 一致性: 執行事

關於事務管理的理解和Spring事務管理

轉載於:http://www.mamicode.com/info-detail-1248286.html1 初步理解理解事務之前,先講一個你日常生活中最常乾的事:取錢。 比如你去ATM機取1000塊錢,大體有兩個步驟:首先輸入密碼金額,銀行卡扣掉1000元錢;然後ATM出10

Spring事務管理

事務的基本原理 Spring事務的本質其實就是資料庫對事務的支援,使用JDBC的事務管理機制,就是利用java.sql.Connection物件完成對事務的提交,那在沒有Spring幫我們管理事務之前,我們要怎麼做。 Connection conn =

可能是最漂亮的 Spring 事務管理

開發十年,就只剩下這套架構體系了! >>>   

mybatis事務管理機制

attribute log builder tween gen 事務管理 getc there spro 1.mybatis事務的配置和使用 mybatis事務有兩種使用方式: (a):使用JDBC的事務管理機制:即使用java.Sql.Connection對象完成對事務的

Java程式設計師從笨鳥到菜鳥之(八十)細談Spring(九)spring+hibernate宣告式事務管理

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Spring Boot事務管理

什麼是事務? 我們在開發企業應用時,對於業務人員的一個操作實際是對資料讀寫的多步操作的結合。由於資料操作在順序執行的過程中,任何一步操作都有可能發生異常,異常會導致後續操作無法完成,此時由於業務邏輯並未正確的完成,之前成功操作資料的並不可靠,需要在這種情況下進行回退。 事務的作用就是為了

spring事務註解@Transactional

事務管理是應用系統開發中必不可少的一部分。Spring 為事務管理提供了豐富的功能支援。 Spring 事務管理分為程式設計式和宣告式的兩種方式。 程式設計式事務指的是通過編碼方式實現事務,程式設計式事務管理使用TransactionTemplate或者直接使用底層的PlatformTransaction

Spring的事件機制

同步事件和非同步事件   同步事件:在一個執行緒裡,按順序執行業務,做完一件事再去做下一件事.       非同步事件:在一個執行緒裡,做一個事的同事,可以另起一個新的執行緒執行另一件事,這樣兩件事可以同時執行.   用一個例子來解釋同步事件和非同步事件的使用場景,有時

Tomcat與Spring中的事件機制

Tomcat與Spring中的事件機制詳解 引言 最近在看tomcat原始碼,原始碼中出現了大量事件訊息,可以說整個tomcat的啟動流程都可以通過事件派發機制串起來,研究透了tomcat的各種事件訊息,基本上對tomcat的啟動流程也就有了一個整體的認識。在這一基礎上,聯想到之前在看spr

Spring中七種Propagation類的事務屬性

       在宣告式的事務處理中,要配置一個切面,其中就用到了propagation,表示打算對這些方法怎麼使用事務,是用還是不用,其中propagation有七種配置,REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT

Spring架構---Spring中的事務管理

Spring中的事務管理詳解 1. 事務簡介: 事務管理是企業級應用程式開發中必不可少的技術,用來確保資料的完整性和一致性 事務就是一系列的動作,它們被當作一個單獨的工作單元。這些動作要麼全部完成,要麼全部不起作用 2. 事務的四個關鍵屬性(ACID) ① 原子性(atomici

SSH:Spring框架(宣告式事務管理

1) 概念:事務 (Transaction) 是訪問並可能更新資料庫中各種資料項的一個程式執行單元 (unit) 。事務通常由高階資料 庫操縱語言或程式語言 (如 SQL , C++ 或 Java ) 書寫的使用者程式的執行所引起, 並用形如 begin transacti

spring註解事務@Transactional

事務註解方式: @Transactional 轉自:http://www.cnblogs.com/caoyc/p/5632963.html 當標於類前時, 標示類中所有方法都進行事物處理 , 例子: 1 @Transactional public class Tes

Spring基本功能

tex factor oid out 負責 sch bsp 初始化 pub 一、SpringIOC   Spring的控制反轉:把對象的創建,初始化,銷毀的過程交給SpringIOC容器來做,由Spring容器控制對象的生命周期。   1.1 啟動Spring容器的方式: