Spring Framework之事務管理

2022-05-29 07:36:15 字數 3234 閱讀 2648

目錄spring事務管理

參考1、事務是什麼?

2、事務的目的是什麼?

​ spring的事務管理底層基於資料庫事務,所以在學習spring事務之前,我們需要先學習資料庫事務。

事務的定義

​ 事務是資料庫管理系統執行過程中的乙個邏輯單位,由乙個有限的資料庫操作序列構成。(來自維基百科)

​ 簡單翻譯就是將資料資源進行訪問的分步操作組合成乙個整體操作,這一整體執行單元就是事務

事務的目的

​ 事務的目的是保證資料的一致性。

事務的特性

​ 要保證分步操作組合成乙個整體操作時整體成功或整體失敗(同生共死)。就需要有嚴格的定義。

事務的4種特性(acid):原子性(atomicity)、一致性(consistency)、隔離性(isolation)、永續性(durability)。

原子性:同一事務的多個操作是不可分割的最小單元。當所有操作都執行成功時,才提交事務,否則撤銷所有操作成功的操作並恢復資料庫至初始狀態。

一致性:提交事務後,資料結果與業務預期規則保持一致。例如a向b轉賬無論事務是否提交成功,兩賬戶總額是不變的。

隔離性:併發操作時事務與事務間存在隔離,互不干擾,隔離性取決於資料庫的隔離級別。

永續性:事務提交成功後,事務中的一系列操作將持久化至資料庫中。

事務隔離級別

讀未提交:乙個事務可以讀取另乙個未提交的內容。可能會出現「髒讀」、「不可重複讀」、「幻讀」。

讀提交:乙個事務只能讀取到另乙個資料已經提交成功的內容。可能會出現「不可重複讀」、「幻讀」。大部分資料庫的預設隔離級別

可重複讀:整個事務過程中多次對同一筆資料讀取結果相同。可能會出現「幻讀」。mysql預設級別。

序列化:所有事務操作都必須按照順序依次執行。最嚴格的隔離級別。

資料併發問題

髒讀:事務1對資料進行更新,但未提交,但事務2能夠讀取到未提交的內容。當事務對更新未提交的資料進行回滾時,事務2之前讀取到的。

不可重複讀:同一事務對同一資料多次讀取,每次讀取結果不相同。事務1在事務2更新操作之前與之後分別讀取一次資料,就會出現兩個結果不同的情況。

幻讀:同一事務對同一資料集合進行多次的查詢,每次結果集不同。事務1在事務2插入或刪除操作前後分別讀取一次資料,其操作的結果集不相同。

出現髒讀的原因:"select"操作沒有限制

出現不可重複讀的原因:「update」操作沒有限制

出現幻讀的原因:「insert」和「delete」操作沒有限制

事務隔離級別對資料併發問題的作用

讀未提交的作用:無作用。

讀提交:使用「快照讀」能避免「髒讀」,但不能避免「不可重複讀」、「幻讀」。

可重複讀:使用「快照讀」能避免「髒讀」、「不可重複讀」,但不能避免「幻讀」。

序列化:能避免「髒讀」、「不可重複讀」、「幻讀」。

快照讀​ 快照讀基於mvcc和 undo log實現,適用於簡單的select語句。mvcc 併發版本控制,是靠 readview (事務檢視) 來實現的。

讀已提交:事務中每一條sql都會生成乙個readview。在執行查詢操作時都會讀取最新readview中的值。

可重複讀:事務開始時會生成乙個readview。事務中的多條sql都會讀取到同乙個readview。在多條sql查詢時也會讀取同乙個readview中的值。

​ spring為事務管理提供統一的程式設計模板,在高層次建立統一的事務抽象。

事務管理介面

transactiondefinition

​ 用於描述事務的隔離級別、超時時間、是否為讀取事務以及事務的傳播規則等控制事務的具體屬性。

事務隔離級別

​ transactiondefinition中定義了五個表示隔離級別的常量:

​ (1)transactiondefinition.isolation_default,表示使用資料庫預設隔離界別(oracle採用讀提交,mysql預設採用可重複讀)

​ (2)transactiondefinition.isolation_read_uncommitted,表示讀未提交。

​ (3)transactiondefinition.isolation_read_committed,表示讀提交。

​ (4)transactiondefinition.isolation_repeatable_read,表示可重複讀。

​ (5)transactiondefinition.isolation_serializable,表示序列化。

事務傳播行為

​ 當某個事務被另一事務呼叫時,就需要指定事務傳播。

​ transactiondefinition.propagation_required,如果當前存在事務,則加入該事務;如果當前沒有事務,則建立乙個新的事務,這是最常見的選擇。

​ transactiondefinition.propagation_supports, 如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續執行。

​ transactiondefinition.propagation_mandatory,如果當前存在事務,則加入該事務;如果當前沒有事務,則丟擲異常。

事務超時

​ 超過事務被允許執行的時間,事務在規定時間未完成將自動回滾事務。transactiondefinition中以秒為預設單位。

唯讀狀態

​ 事務只對事務資源進行讀操作,不修改任何資料。如果只對事務資源資料進行讀取操作,可以設定為唯讀狀態,以提公升執行效能。

回滾規則

​ 用於定義回滾與不會滾的對應異常。預設情況下事務在執行期遇到特定異常時才回滾。

transactionstatus

​ 用於表示事務的具體執行狀態。事務管理器能夠通過該介面獲取事務執行期的狀態資訊,也可以通過該介面間接地回滾事務,相比於在丟擲異常時事務回滾更有意義。

platformtransactionmanager

​ 事務管理器,提供事務提交、回滾以及根據事務定義資訊從事務環境中返回乙個已經存在的事務或建立乙個新事務。

[1]資料庫事務

[2][3]

[4][5]《精通spring4.x 企業應用開發實戰》

Spring FrameWork 學習總結

spring framework主要包含以下內容 1.ioc 和 di ioc容器功能 例項化 初始化元件 裝配元件依賴關係 負責元件生命周管理 ioc inversion of control 是乙個重要的物件導向程式設計的法則來削減電腦程式的耦合問題,也是輕量級spring框架核心。di dep...

Spring FrameWork 總結 依賴

package x.y public class foo beanfactory對於它所管理的bean提供兩種注入依賴方式 實際上它也支援同時使用構造器注入和setter方式注入依賴 需要注入的依賴將儲存在beandefinition中,它能根據指定的propertyeditor實現將屬性從一種格式...

用Spring framework實現定時器功能

採用web自動載入timermanager來治理timer鏈,在class更新伺服器熱載入後會發生異常。這要求對timermanager進行一些非凡的處理才能保證timer鏈的正確性。使用spring framework中提供的timertask自動載入功能可以非常輕易的實現定時器鏈的治理。同時,採...