欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

帶大家深入了解Spring事務

 更新時間:2021年05月13日 09:15:44   作者:夜雨風云  
Spring框架提供統(tǒng)一的事務抽象,通過統(tǒng)一的編程模型使得應用程序可以很容易地在不同的事務框架之間進行切換. 在學習Spring事務前,我們先對數據庫事務進行簡單的介紹。,需要的朋友可以參考下

一、數據庫事務簡介

構成單一邏輯工作單元的操作集合稱作事務(transaction)。即使有故障,數據庫系統(tǒng)也必須保證事務的正確執(zhí)行——要么執(zhí)行整個事務,要么屬于該事務的操作一個也不執(zhí)行。以資金轉賬為例,應該保證支票賬戶支出金額的操作和儲蓄賬戶的存入金額的操作在同一個邏輯工作單元內完成。簡言之,事務是訪問并可能更新各種數據項的一個程序執(zhí)行單元(unit)。

二、事務的特性

數據庫需要維護事務的以下四個性質:

1.原子性(Atomicity)事務是一個原子操作,由一系列動作組成。事務的原子性確保這一系列動作要么全部完成,要么完全不起作用。

2.一致性(Consistency)隔離執(zhí)行事務時(在沒有其他事務并發(fā)的情況下),保持數據庫的一致的數據庫狀態(tài)。

3.隔離性(Isolation)并發(fā)事務執(zhí)行之間無影響,在一個事務內部的操作對其他事務是不產生影響,這需要事務隔離級別來指定隔離性。每個事務都感覺不 到系統(tǒng)中其他事務在并發(fā)地執(zhí)行。

4.持久性(Durability)一旦事務完成,數據庫的改變必須是永久的,即使出現系統(tǒng)故障。

三、事務的隔離級別

在實際應用中,數據庫中的數據是要被多個用戶共同訪問的,在多個用戶同時操作相同的數據時,可能就會出現一些事務并發(fā)的問題:

1.臟讀(Dirty Read)。一個事務讀取到另一個事務未提交的數據。

2.不可重復讀(Non-repeatable Read)。一個事務對同一行數據重復讀取兩次,但得到的結果不同。

3.虛讀/幻讀(Phantom Read)。一個事務執(zhí)行兩次查詢,但第二次查詢的結果包含了第一次查詢中未出現的數據。

4.丟失更新(Lost Update)。丟失更新可分為兩類,分別是第一類丟失更新和第二類丟失更新。第一類丟失更新是指兩個事務同時操作同一個數據時,當第一個事務撤銷時,把已經提交的第二個事務的更新數據覆蓋了,第二個事務就造成了數據丟失。第二類丟失更新是指當兩個事務同時操作同一個數據時,第一個事務將修改結果成功提交后,對第二個事務已經提交的修改結果進行了覆蓋,對第二個事務造成了數據丟失。

為了避免上述事務并發(fā)問題的出現,在標準的 SQL 規(guī)范中定義了四種事務隔離級別,不同的隔離級別對事務的處理有所不同:

1.Serializable(可串行化)
提供嚴格的事務隔離。它要求事務序列化執(zhí)行,事務只能一個接一個地執(zhí)行,不能并發(fā)執(zhí)行。此隔離級別可有效防止臟讀、不可重復讀、幻讀。但這個級別可能導致大量的超時現象和鎖競爭,在實際應用中很少使用。

2.Repeatable Read(可重復讀)
一個事務在執(zhí)行過程中,可以訪問其他事務成功提交的新插入的數據,但不可以訪問成功修改的數據。讀取數據的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事務。此隔離級別可有效防止不可重復讀和臟讀。

3.Committed Read(已提交讀)
一個事務在執(zhí)行過程中,既可以訪問其他事務成功提交的新插入的數據,又可以訪問成功修改的數據。讀取數據的事務允許其他事務繼續(xù)訪問該行數據,但是未提交的寫事務將會禁止其他事務訪問該行。此隔離級別可有效防止臟讀。

4.Uncommitted Read(未提交讀)
一個事務在執(zhí)行過程中,既可以訪問其他事務未提交的新插入的數據,又可以訪問未提交的修改數據。如果一個事務已經開始寫數據,則另外一個事務不允許同時進行寫操作,但允許其他事務讀此行數據。此隔離級別可防止丟失更新。
以上所有隔離性級別都不允許臟寫(Dirty Write)。

一般來說,事務的隔離級別越高,越能保證數據庫的完整性一致性,但相對來說,隔離級別越高,對并發(fā)性能的影響也越大。因此,通常將數據庫的默認隔離級別設置為已提交讀 (Committed Read),它既能防止臟讀,又能有較好的并發(fā)性能。雖然這種隔離級別會導致不可重復讀、幻讀和第二類丟失更新這些并發(fā)問題,但可通過在應用程序中采用悲觀鎖或樂觀鎖加以控制。

四、Spring事務

Spring事務的本質就是數據庫對事務的支持,使用JDBC的事務管理機制,利用java.sql.Connection對象完成對事務的提交,未使用Spring框架前,Java中事務實現示例代碼如下:

package com.example.demo;

import java.sql.Connection;
import java.sql.DriverManager;

public class DemoApplication {

    public static void main(String[] args) {
        // 1.獲取連接
        Connection conn = DriverManager.getConnection();
        try {
            // 2.將自動提交設置為false
            conn.setAutoCommit(false);  
            /*-----------------*/
            // 3.執(zhí)行一到多個CRUD操作
            /*-----------------*/
            // 4.1手動提交
            conn.commit();
        } catch (Exception e) {
            // 4.2一旦其中一個操作出錯都將回滾,所有操作都不成功
            conn.rollback();
        } finally {
            // 5.關閉連接
            conn.colse();
        }
    }
}

Spring框架則提供統(tǒng)一的事務抽象,無論是JTA、JDBC、Hibernate/JPA、Mybatis/Mybatis-Plus,Spring都使用統(tǒng)一的編程模型,使得應用程序可以很容易地在不同的事務框架之間進行切換。這也符合面向接口編程思想。Spring事務框架的代碼在org.springframework:spring-tx中。Spring事務抽象的核心類圖如下:

在這里插入圖片描述

Spring事務管理的核心接口是PlatformTransactionManager。接口PlatformTransactionManager定義事務操作的行為,PlatformTransactionManager依賴TransactionDefinition和TransactionStatus接口。TransactionDefinition接口定義與Spring兼容的事務屬性(如隔離級別、事務傳播行為等)。TransactionStatus接口則定義事務的狀態(tài)(如是否回滾、是否完成、是否包含安全點(Save Point)、將基礎會話刷新到數據存儲區(qū)(如果適用)等)。

五、PlatformTransactionManager簡介

PlatformTransactionManager是Spring事務框架的核心接口。應用程序可以直接使用PlatformTransactionManager,但它并不是主要用于API:應用程序將借助事務模板(TransactionTemplate)或聲明式事務(Declarative Transaction)。
對于需要實現PlatformTransactionManager接口的應用程序,可通過繼承AbstractPlatformTransactionManager抽象類的方式實現。AbstractPlatformTransactionManager類已實現事務傳播行為和事務同步處理。子類需要實現針對事務特定狀態(tài)(如:begin,suspend,resume,commit)的模板方法。Spring事務框架已經實現了JtaTransactionManager(JPA)和DataSourceTransactionManager(JDBC)。應用程序可以參考以上方法實現事務管理器。PlatformTransactionManager事務繼承示例如下:

在這里插入圖片描述

六、Spring事務隔離級別和傳播級別

TransactionDefinition接口中定義了Spring事務隔離級別和Spring事務傳播級別。隔離級別主要控制事務并發(fā)訪問時隔離程度。Spring支持的隔離級別如下:

在這里插入圖片描述

除了使用ISOLATION_DEFAULT表示使用數據庫默認的隔離級別外,其余四個隔離級別與數據庫規(guī)范的隔離級別一致。
需要注意的是,隔離級別越高,意味著數據庫事務并發(fā)執(zhí)行性能越差。JDBC規(guī)范雖然定義了事務支持的以上行為,但是各個JDBC驅動、數據庫廠商對事務的支持程度可能各不相同。出于性能的考慮我們一般設置READ_COMMITTED級別。針對READ_COMMITTED隔離級別無法避免的臟讀,通常使用數據庫的鎖來處理。
傳播級別主要控制含事務方法的調用(如一個事務方法調用另一個事務方法)時,Spring對事務的處理方式。Spring事務傳播級別共七類。它們是:

(1)PROPAGATION_REQUIRED:支持當前事務,如果當前有事務則加入,如果當前沒有事務則新建一個。這種方式是默認的事務傳播方式。

(2)PROPAGATION_SUPPORTS:支持當前事務,如果當前有事務則加入,如果當前沒有事務則以非事務方式執(zhí)行。

(3)PROPAGATION_MANDATORY:支持當前事務,如果當前有事務則加入,如果當前沒有事務則拋出異常。(當前必須有事務)

(4)PROPAGATION_REQUIRES_NEW:支持當前事務,如果當前有事務則掛起當前事務,然后新創(chuàng)建一個事務,如果當前沒有事務則自己創(chuàng)建一個事務。

(5)Propagation_NOT_SUPPORTED:不支持當前事務,如果當前有事務則把當前事務掛起,執(zhí)行完后恢復事務(忽略當前事務)。

(6)PROPAGATION_NEVER:不支持當前事務,如果當前存在事務,則拋出異常。(當前必須不能有事務)

(7)PROPAGATION_NESTED:如果當前存在事務,則嵌套在當前事務中。如果當前沒有事務,則新建一個事務自己執(zhí)行。對嵌套事務來說,內部事務回滾時不會影響外部事務的提交;但是外部事務回滾會把內部事務一起回滾回去。(這個和新建一個事務的區(qū)別)

到此這篇關于帶大家深入了解Spring事務的文章就介紹到這了,更多相關Spring事務內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Spring @Value注解失效問題解決方案

    Spring @Value注解失效問題解決方案

    這篇文章主要介紹了Spring @Value注解失效問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • 使用mybatis插件PageHelper實現分頁效果

    使用mybatis插件PageHelper實現分頁效果

    這篇文章主要為大家詳細介紹了使用mybatis插件PageHelper實現分頁效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Java8 HashMap鍵與Comparable接口小結

    Java8 HashMap鍵與Comparable接口小結

    這篇文章主要介紹了Java8 HashMap鍵與Comparable接口小結,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java 詳解如何獲取網絡接口信息

    Java 詳解如何獲取網絡接口信息

    讀萬卷書不如行萬里路,只學書上的理論是遠遠不夠的,只有在實踐中才能獲得能力的提升,本篇文章手把手帶你用Java獲取網絡接口的信息,大家可以在過程中查缺補漏,提升水平
    2021-11-11
  • 一文詳解Java?etcd的應用場景及編碼實戰(zhàn)

    一文詳解Java?etcd的應用場景及編碼實戰(zhàn)

    etcd?是一個高度一致的分布式鍵值存儲系統(tǒng)。本文旨在幫助大家理解etcd,從宏觀角度俯瞰etcd全局,掌握etcd的基本操作技能,需要的可以參考一下
    2022-08-08
  • java設置session過期時間的實現方法

    java設置session過期時間的實現方法

    這篇文章主要介紹了java設置session過期時間的實現方法,以實例形式詳細講述了具體實現過程,非常具有參考借鑒價值,需要的朋友可以參考下
    2014-10-10
  • Java編程中應用的GUI設計基礎

    Java編程中應用的GUI設計基礎

    這篇文章主要介紹了Java編程中應用的GUI設計基礎,為一些Java開發(fā)CS類型應用的基礎概念知識,需要的朋友可以參考下
    2015-10-10
  • 一文搞懂Java正則表達式的使用

    一文搞懂Java正則表達式的使用

    正則表達式,又稱規(guī)則表達式,是一種文本模式。正則表達式使用單個字符串來描述、匹配一系列匹配某個句法規(guī)則的字符串,通常被用來檢索、替換那些符合某個模式(規(guī)則)的文本。本文將通過示例為大家詳細說說Java正則表達式的使用,感興趣的可以了解一下
    2022-08-08
  • SpringBoot中shiro過濾器的重寫與配置詳解

    SpringBoot中shiro過濾器的重寫與配置詳解

    在前后端分離跨域訪問的項目中shiro進行權限攔截失效 (即使有正確權限的訪問也會被攔截) 時造成302重定向錯誤等問題,為解決這個問題,就需要進行shiro過濾器的重寫以及配置。本文詳細介紹了解決方法,需要的可以參考一下
    2022-04-04
  • Java 獲取原始請求域名實現示例

    Java 獲取原始請求域名實現示例

    這篇文章主要為大家介紹了Java 獲取原始請求域名實現示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12

最新評論