激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

香港云服务器
服務器之家 - 編程語言 - Java教程 - Spring事務隔離級別簡介及實例解析

Spring事務隔離級別簡介及實例解析

2021-04-01 11:24CupOnDesk Java教程

這篇文章主要介紹了Spring事務隔離級別簡介及實例解析,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下

本文研究的主要是spring事務隔離級別(solation level)介紹及例子,具體如下。

當兩個事務對同一個數據庫的記錄進行操作時,那么,他們之間的影響是怎么樣的呢?這就出現了事務隔離級別的概念。數據庫的隔離性與并發控制有很大關系。數據庫的隔離級別是數據庫的事務特性acid的一部分。acid,即原子性(atomicity)、一致性(consistency)、隔離性(isolation)和持久性(durability)。spring的事務隔離級別有四個:read_uncommittedread_committedrepeatable_readserializable。還有一個,是數據庫默認的隔離級別default,mysql默認是repeatable_read

下面來具體看看。

read_uncommitted

 

顧名思義,read_uncommitted意思是,一個事務可以讀取到另一個事務未提交的事務記錄。換句話說,a transaction can read the data that is still uncommitted by other transactions。這是spring事務最弱的隔離級別。見下面的圖,事務a開啟,寫入一條記錄,這時候,事務b讀入數據,讀到了這條記錄,但是,之后事務a回滾。因此,事務b讀到的數據不是有效的(the database is in an invalid state)。這種情況稱為臟讀(dirty read)。除了臟讀的問題,read_uncommitted還可能出現non-repeatable read(不可重復讀)和phantom read(幻讀)的問題。

Spring事務隔離級別簡介及實例解析

read_committed

 

read_committed隔離級別表明,一個事務只能讀取到已經提交的記錄,不能讀取到未提交的記錄。換句話說,a transaction can only read the committed data, and it can't read the uncommitted data.因此,dirty read的情況不再發生,但可能會出現其他問題。見下圖。

Spring事務隔離級別簡介及實例解析

在事務a兩次讀取的過程之間,事務b修改了那條記錄并進行提交。因此,事務a前后兩次讀取的記錄不一致。這個問題稱為non-repeatable read(不可重復讀)。(兩次讀取的記錄不一致,重復讀取就會發現問題。)

除了non-repeatable read的問題,read_committed還可能發生phantom read的問題。

repeatable_read

 

repeatable_read意思是,一個事務可以多次從數據庫讀取某條記錄,而且多次讀取的那條記錄都是一致的,相同的。這個隔離級別可以避免dirty read和non-repeatable read的問題,但可能發生phantom read的問題。如下圖。

Spring事務隔離級別簡介及實例解析

事務a兩次從數據庫讀取一系列記錄,期間,事務b插入了某條記錄并提交。事務a第二次讀取時,會讀取到事務b剛剛插入的那條記錄。在事務期間,事務a兩次讀取的一系列記錄不一致,這個問題稱為phantom read。

serializable

 

serializable是spring最強的隔離級別。事務執行時,會在所有級別上加鎖,比如read和write時都會加鎖,仿佛事務是以串行的方式進行的,而不是一起發生的。這會防止dirty read、non-repeatable read和phantom read的出現,但是,會帶來性能的下降。

default

mysql默認是repeatable_read

例子

下面,我們看一個例子。在數據庫mysql里開啟一個事務,不提交。然后,另一個事務讀取記錄。

剛開始,數據庫里的記錄,如圖

Spring事務隔離級別簡介及實例解析

接下來,在數據庫mysql中開啟事務a,并插入一條記錄。

Spring事務隔離級別簡介及實例解析

在service的業務類的事務屬性配置為read_uncommitted

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@transactional(isolation=isolation.read_uncommitted)
public class accountservice {
    private accountdao accountdao;
    public accountdao getaccountdao() {
        return accountdao;
    }
    public void setaccountdao(accountdao accountdao) {
        this.accountdao = accountdao;
    }
    public void transfer(string from, string to, double money) {
        accountdao.outmoney(from, money);
        accountdao.inmoney(to, money);
    }
    public void readalluser() {
        list<account> accounts = accountdao.getalluser();
        for (account account : accounts) {
            system.out.println(account);
        }
    }
}

運行下面的測試類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.chris.service;
import static org.junit.assert.*;
import org.junit.test;
import org.junit.runner.runwith;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.test.context.contextconfiguration;
import org.springframework.test.context.junit4.springjunit4classrunner;
@runwith(springjunit4classrunner.class)
@contextconfiguration("classpath:applicationcontext.xml")
public class readallusertest {
    @autowired
      private accountservice accountservice;
    @test
      public void test() {
        accountservice.readalluser();
    }
}

結果如下:

Spring事務隔離級別簡介及實例解析

可見,這個事務讀取到了未提交的數據。

這時候,將mysql中開啟的事務a回滾。

?
1
mysql> rollback;

再次運行程序,結果為

account [name=michael, money=1000.0]
account [name=jane, money=1000.0]
account [name=kate, money=1000.0]

總結

以上就是本文關于spring事務隔離級別簡介及實例解析的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

原文鏈接:http://blog.csdn.net/csdn_so_nice/article/details/54290665

延伸 · 閱讀

精彩推薦
  • Java教程Spring 6.0 將停止支持 Freemarker 和 JSP

    Spring 6.0 將停止支持 Freemarker 和 JSP

    Spring Framework 6.0 第一個里程碑版本已經發布,目前已經可以從Spring Repo獲取。這里有一些新變更我們可以提前了解一下。...

    碼農小胖哥12642021-12-31
  • Java教程Java開發常見異常及解決辦法詳解

    Java開發常見異常及解決辦法詳解

    這篇文章主要介紹了java程序常見異常及處理匯總,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考...

    cutercorley12252021-12-18
  • Java教程淺談sql_@SelectProvider及使用注意說明

    淺談sql_@SelectProvider及使用注意說明

    這篇文章主要介紹了sql_@SelectProvider及使用注意說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教...

    icecoola_6892021-11-04
  • Java教程淺談java 中equals和==的區別

    淺談java 中equals和==的區別

    這篇文章主要介紹了java 中equals和==的區別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小...

    獨特潤許多人5982021-07-21
  • Java教程Spring Cloud Gateway 如何修改HTTP響應信息

    Spring Cloud Gateway 如何修改HTTP響應信息

    這篇文章主要介紹了Spring Cloud Gateway 修改HTTP響應信息的方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教...

    帷幄庸者13712021-10-13
  • Java教程mybatis調用存儲過程的實例代碼

    mybatis調用存儲過程的實例代碼

    這篇文章主要介紹了mybatis調用存儲過程的實例,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    動力節點11732021-01-25
  • Java教程二進制中1的個數

    二進制中1的個數

    這篇文章介紹了二進制中1的個數,有需要的朋友可以參考一下 ...

    java之家2662019-10-15
  • Java教程mybatis批量新增、刪除、查詢和修改方式

    mybatis批量新增、刪除、查詢和修改方式

    這篇文章主要介紹了mybatis批量新增、刪除、查詢和修改方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教...

    xuforeverlove7492022-01-24
882
主站蜘蛛池模板: 成人一区久久 | 欧美精品日日鲁夜夜添 | 久久精品国产久精国产 | 91看片免费看 | 哪里可以看免费的av | 亚洲第一激情 | 欧美精品一区二区三区四区 | 老a影视网站在线观看免费 欧美日韩成人一区二区 | 欧美一级棒| 失禁高潮抽搐喷水h | h色在线观看 | 国产成人精品二区 | 日韩精品免费看 | 国产精品99久久久久久久 | 美国人成人在线视频 | 国产精品视频在 | 午夜久久久久 | 久久99国产精品久久99果冻传媒 | 一级毛片免费大片 | 久久成人视屏 | 成人一级视频在线观看 | 91情侣偷在线精品国产 | 日韩黄色免费在线观看 | 羞羞视频免费入口网站 | 久久久一区二区三区四区 | 做羞羞视频| 国产精品久久久久久久久久大牛 | 87成人免费看片 | 欧美精品一区二区视频 | 国产一级免费av | 国产精品久久久久久久久久iiiii | 国产亚洲精品久久久久久久久久 | 成人在线观看免费高清 | 国产亚洲精品久久午夜玫瑰园 | 国产精品成人一区二区三区电影毛片 | 国产精品岛国久久久久久 | 国产91九色视频 | 国产精品成人亚洲一区二区 | 黄色av网站免费 | 亚洲字幕av| 中文字幕在线免费 |