使用Spring框架實現資料庫事務處理

2020-12-11 米粒教育

企業級應用系統在更新資料庫數據時,一般都採用資料庫事務處理,以確保資料庫數據的一致性。本文主要討論在Spring框架中如何使用資料庫事務處理更新資料庫數據。通過本課的學習,可以達到如下目標。

● 了解JDBC對資料庫事務處理的支持

● 掌握在Spring框架中使用事務處理的技術

事務處理對資料庫來說,是對資料庫的一系列SQL語句操作,這些操作被組織為一個事務。事務具有原子性,即事物中的操作要麼全部執行,要麼全部不執行。若事務中的SQL語句在執行過程中發生錯誤,事務需要對已經執行的SQL語句進行回滾操作,撤銷先前對資料庫的操作,防止資料庫出現錯誤狀態。

例如,在課程案例mooc資料庫中,一個業務是學生購買課程,購買課程業務步驟包括更新teacher表,記錄老師的收入,同時student_course表增加一條購買記錄,更新student表的餘額欄位。上述業務步驟需要全部執行完畢,才能反映出學生購買課程的正確狀態。如果因意外情況,上述操作僅成功執行了部分SQL語句,其它語句沒有執行或執行失敗,就會造成學生購買課程這個業務記錄不完整,資料庫處於數據錯亂狀態。若利用資料庫事務技術執行上述操作,當發生上述情況時,資料庫系統會將先前執行的SQL語句撤銷,將資料庫回滾到事務執行前狀態。

1、JDBC對資料庫事務處理的支持

JDBC本身就提供了對資料庫事務處理的支持,使用java.sql.Connection對象完成事務的提交。使用Connection提交資料庫事務處理代碼如下。

Connection類的setAutoCommit方法用於設置JDBC提交SQL語句的方式。設置為ture時,JDBC自動提交SQL語句,JDBC提交SQL語句的方式默認為true。設置為false時,SQL語句的提交由應用程式負責,應用程式必須調用commit方法,同時要在執行SQL語句異常處理塊中調用rollback方法,對異常發生前進行的資料庫進行回滾操作。

在企業級應用中,事務一般是並發執行的,當事務並發執行時,就會發生資料庫數據同步的問題,具體問題可分為下面四種類型。

(1)髒讀:一個資料庫事務在更新數據的過程中,數據是保存在內存中的,只有調用commit方法,更新的數據才最終寫到資料庫中。如果一個事務使用了另一個事務更新但沒保存的數據,這個數據就稱為髒數據,事務讀取這個數據就稱為髒讀。

(2)不可重複讀:在同一事務中,兩次讀取同一記錄,讀取的記錄內容卻不相同。例如,事務A第一次讀取了一條記錄,同時事務B更新並提交了該條記錄,事務A第二次讀取該條記錄時,當前讀取的記錄內容和第一次讀取的記錄內容不相同。

(3)幻讀:當事務A對表中的所有記錄進行了修改,同時事務B又在表中插入了一條新的記錄。A事務在後續對該表操作時,就會發現表中還存在沒有修改的記錄,就好象發生了幻覺一樣。

(4)丟失更新:當事務A和事務B對同一數據進行修改時,就會發生丟失更新的問題。例如,B事務對m記錄進行了修改,A事務在修改m記錄時發生異常並回滾,就會將B事務對m記錄的修改覆蓋掉。

為了解決上面提到的事務並發問題,JDBC定義了五種事務隔離級別來解決來解決這些並發導致的問題。

表1 JDBC提供的事務隔離級別說明

表中隔離級別從上到下依次增高,最高級別是TRANSACTION_SERIALIZABLE,它通過強制事務串行執行(不是並行),避免了事務並發執行導致發生的數據同步問題。出於應用程式訪問資料庫性能的考慮,一般設置隔離級別為TRANSACTION_READ_COMMITTED。

2、在Spring框架中調用事務處理

下面給出具體執行事務處理的案例程序。案例程序的數據源採用mooc資料庫,mooc資料庫的結構以及本案例中沒有列出的代碼詳見《Spring使用JDBC訪問MySQL資料庫》一文。

讓Spring框架開始執行一個資料庫事務時,需要分成三步走。第一步配置數據源DataSource;第二步聲明事務管理TransactionManager類;第三步定義可以執行事務的DAO類。

第一步:配置數據源DataSource

需要讓Spring框架知道資料庫的位置及其連接方式,這個工作由DataSource完成。Spring框架通過DataSource連接資料庫,DataSource既可以在Spring框架的配置文件中配置,也可以放在Bean類中配置。下面是在Spring配置文件中配置數據源的代碼。

配置語句定義了MySQL資料庫的URL地址、訪問帳戶及訪問密碼。

第二步:聲明事務管理TransactionManager

Spring 框架提供了PlatformTransactionManager作為事務管理類的頂層接口,聲明了初始化事務、提交事務、回滾事務等接口。接口實現由具體的資料庫驅動類實現。具體包括DataSourceTransactionManager、HibernateTransactionManager等實現類。本文主要用DataSourceTransactionManager來實現事務的管理。在Spring框架配置文件中配置DataSourceTransactionManager類。

聲明DataSourceTransactionManager類,需要傳入之前已聲明的DataSource數據源。

第三步:定義可以執行事務的DAO類

DAO提供了應用程式訪問數據源必要的接口和方法,接口和方法的具體實現細節,程序並不需要了解。DAO的具體細節詳見《Spring使用JDBC訪問MySQL資料庫》一文。

CourseTransactio類實現了CourseDao接口,CourseDao是訪問mooc資料庫的頂層接口,接口提供了mooc資料庫表的增刪改查操作。CourseTransactio主要實現了CourseDao類的buyCourse,實現學生購買課程事務。購買課程事務涉及到更新teacher表,在student_course表增加一條購買記錄,更新student表的餘額欄位資料庫操作,這些操作需要進行連續處理,中間不能中斷出錯,如果出錯則需要做回滾處理。 因此,buyCourse方法採用資料庫事務進行處理。

事務處理從TransactionDefinition開始,前面我們談到了事務的隔離級別,TransactionDefinition就是用來定義事務隔離級別的。DefaultTransactionDefinition表示使用資料庫的默認隔離級別,對大部分資料庫而言,默認隔離級別是TRANSACTION_READ_COMMITTED。

當TransactionDefinition 創建後,可以通過調用 getTransaction方法開始事務,該方法會返回 TransactionStatus 的一個實例。 TransactionStatus 用於追蹤當前的事務狀態,如果後面的SQL語句都運行成功,可以使用 TransactionManager 的 commit() 方法來提交這個事務,否則使用 rollback() 方法來回滾整個操作。

完整的配置文件代碼。

學生實體類代碼。

老師實體類代碼。

student表映射到學生實體類。

teacher表映射到老師實體類。

測試類代碼。

課程小結

(1)事務處理對資料庫來說,是對資料庫的一系列SQL語句操作,這些操作被組織為一個事務。事務具有原子性,即事物中的操作要麼全部執行,要麼全部不執行。若事務中的SQL語句在執行過程中發生錯誤時,事務需要對已經執行的SQL語句進行回滾操作,撤銷先前對資料庫的操作,防止資料庫出現錯誤狀態。

(2)讓Spring框架開始執行一個資料庫事務時,需要分成三步走。第一步配置數據源DataSource;第二步聲明事務管理TransactionManager類;第三步定義可以執行事務的DAO類。

相關焦點

  • 使用Spring Cloud Data Flow 來實現數據流處理
    隨著雲原生、微服務應用等的概念的逐漸深入人心,很多企業用戶都已經在使用Spring Boot和Spring Cloud等流行的開源技術框架來開發Java微服務,實現很多在線事務處理
  • Spring Batch 批處理框架技巧
    在大型的企業應用中,或多或少都會存在大量的任務需要處理,如郵件批量通知所有將要過期的會員等等。而在批量處理任務的過程中,又需要注意很多細節,如任務異常、性能瓶頸等等。那麼,使用一款優秀的框架總比我們自己重複地造輪子要好得多一些。我所在的物聯網雲平臺部門就有這麼一個需求,需要實現批量下發命令給百萬設備。
  • 如何使用 Spring 對資料庫進行 CURD?
    作者 | 阿文,責編 | 郭芮頭圖 | CSDN 下載自視覺中國作為一名程式設計師,CURD(增刪改查)是一件必不可少的事情,甭管你是初級程式設計師還是高級程式設計師都會和資料庫打交道。那麼在Java中如何通過Spring 框架來對資料庫進行操作呢?本文將帶你一起來學習。
  • 一文輕鬆搞定批處理框架 Spring Batch
    這類工作即為「批處理」  為什麼使用Spring Batch  Spring Batch 作為 Spring 的子項目,是一款基於 Spring 的企業批處理框架。通過它可以構建出健壯的企業批處理應用。
  • Spring的編程式事務和聲明式事務詳解
    通常情況下,事務的結果被寫到持久化存儲器中;事務類型編程式事務:通過編程代碼在業務邏輯時需要時自行實現,粒度更小;聲明式事務:通過註解或XML配置實現;JDBC事務:即為上面說的資料庫事務中的本地事務,通過connection對象控制管理;JTA事務:指Java事務API(Java Transaction API),是Java EE資料庫事務規範,JTA只提供了事務管理接口,由應用程式伺服器廠商(如
  • Spring事務管理
    SavePoint保存點事務中可以設置一些保存點(階段標識),回滾時可以指定回滾到前面的哪個保存點。6. Commit/Rollback提交/回滾提交、回滾事務三、Spring事務使用學習1. 配置事務管理器 <!
  • Spring事務基礎
    它除了保證一個事務不能被另外一個事務讀取未提交的數據之外還避免了以下情況產生(不可重複讀)。(4)serializable:這是花費最高代價但最可靠的事務隔離級別。事務被處理為順序執行。除了防止髒讀,不可重複讀之外,還避免了幻象讀說明:a.髒讀:指當一個事務正字訪問數據,並且對數據進行了修改,而這種數據還沒有提交到資料庫中,這時,另外一個事務也訪問這個數據,然後使用了這個數據。因為這個數據還沒有提交那麼另外一個事務讀取到的這個數據我們稱之為髒數據。依據髒數據所做的操作肯能是不正確的。
  • 這可能是對 Spring 事務原理講解最透徹的文章了
    Spring事務的基本原理首先澄清一個誤點:Spring本身是沒有事務一說的,資料庫對事務的支持才是Spring事務的本質。假設我們經常使用的MySQL資料庫不提供事務功能,毫無疑問Spring也就無法提供事務功能了。
  • 在實際開發中對數據流的處理,和事務處理中遇到的坑,及解決方案
    當然I/O流處理與事務處理,也是比較讓人頭疼的,但是這些坑總要有人踩的,踩過以後,那就扶搖直上了。無論使用什麼框架,關於資料庫回滾建議在serivce層使用Transactional。ThrowableSpring框架的事務基礎架構代碼,默認地在運行時和unchecked exceptions時,才進行事務回滾
  • Spring事務實現原理
    同時為了簡化事務管理器的實現,Spring提供了一個抽象類AbstractPlatformTransactionManager,規定了事務管理器的基本框架,僅將依賴於具體平臺的特性作為抽象方法留給子類實現。事務狀態——TransactionStatus事務狀態是我對TransactionStatus這個類的直譯。
  • spring之事務回滾技巧
    當遇到這種情況,我們就可以使用Spring的事務解決這個問題。JAVA 語言規定必須對checked Exception作處理,編譯器會對此作檢查,要麼在方法體中聲明拋出checked Exception,要麼使用catch語句捕獲checked Exception進行處理,不然不能通過編譯。
  • 如何理解 Spring AOP 以及使用 AspectJ?
    為啥要使用 AOP在學習AOP 之前,我們先了解下為啥我們要使用AOP?那麼,在傳統的業務處理代碼中,比如你要操作資料庫,會進行事務的處理或者列印一些日誌。因為傳統的面向對象思想只能實現父子關係的縱向重用。在AOP思想中,通過aspect(切面)可以分別在不同的類的方法中加入,例如事務日誌權限和異常處理等功能。使用切面這種橫向方式。能夠使開發人員在編寫業務邏輯時專注於核心業務邏輯,而不用過度的關注與其他業務邏輯的實現。這樣可以提高開發效率,同時還增強了代碼的可維護性。
  • Java 第一大框架:Spring 的 IoC 跟 AOP 雛形如何實現?
    簡而言之Spring是Java目前「第一大框架」,Spring框架是由於軟體開發的複雜性而創建的。Spring使用的是基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅僅限於伺服器端的開發。從簡單性、可測試性和鬆耦合性角度而言,絕大部分Java應用都可以從Spring中受益。目的:解決企業應用開發的複雜性,簡化應用程式的開發。
  • Spring Batch真是個優秀的批處理框架,用完愛不釋手!
    1 前言Spring Batch是一個輕量級的、完善的批處理框架,作為Spring體系中的一員,它擁有靈活、方便、生產可用的特點。在應對高效處理大量信息、定時處理大量數據等場景十分簡便。結合調度框架能更大地發揮Spring Batch的作用。
  • 通過例子講解Spring Batch入門,優秀的批處理框架
    Spring Batch是一個輕量級的、完善的批處理框架,作為Spring體系中的一員,它擁有靈活、方便、生產可用的特點。在應對高效處理大量信息、定時處理大量數據等場景十分簡便。結合調度框架能更大地發揮Spring Batch的作用。
  • Spring JDBC訪問關係型資料庫
    其中的步驟可以抽象為:對於上述步驟,實際上很多部分都是通用的——即對於每一次資料庫訪問都沒有變化,例如定義參數、打開連接、處理異常、事務處理、資源釋放。完全沒有必要再每一次訪問裡都編寫這些代碼,一種辦法是將這些代碼封裝起來。
  • Java程式設計師必會 springmvc-spring-mybatis框架整合搭建傻瓜教程
    ssm是用於將springmvc-spring-mybatis三個框架整合來進行java開發web項目。本文通過ssm三大框架整合的形式講解springmvc的使用教程,最新的框架版本主流IDE,只要按照圖中步驟能夠保證每個人的框架搭建完成並成功運行。這裡使用maven來構建項目,我們需要創建一個名為ssm的maven項目,打包方式為war包。
  • SpringBoot(五) :spring data jpa 的使用
    的使用.html如有好文章投稿,請點擊 → 這裡了解詳情在上篇文章《 springboot(二):web綜合開發 》中簡單介紹了一下spring data jpa的基礎性使用,這篇文章將更加全面的介紹spring data jpa 常見用法以及注意事項。
  • Java程式設計師必會 springmvc框架實現異常處理與文件上傳
    本次講解Springmvc框架在ssm框架環境下進行開發時可能會使用到的一些功能。首先是springmvc的異常處理器組件。我們在dispatcherServlet的perproty中可以看得到dispatcherServlet內部的所有可以被我們改動的組件。
  • 資料庫事務處理原理與實例剖析
    熟悉關係型資料庫內核的原理和技術,並有較豐富的實踐經驗。喜歡琢磨資料庫內核的基本原理和算法,並樂於討論和分享。  正文  我今天的演講叫資料庫事務處理的原理和實例剖析。共分為三部分:事務處理的原理,PostgreSQL的事務處理機制剖析,和一個簡單的總結和展望。