日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

使用Spring框架实现数据库事务处理

發布時間:2025/3/15 javascript 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Spring框架实现数据库事务处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

企業級應用系統在更新數據庫數據時,一般都采用數據庫事務處理,以確保數據庫數據的一致性。本文主要討論在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框架实现数据库事务处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。