當(dāng)前位置:首頁 >  站長 >  數(shù)據(jù)庫 >  正文

Mysql事務(wù)特性和級別原理解析

 2021-02-02 16:39  來源: 腳本之家   我來投稿 撤稿糾錯

  域名預(yù)訂/競價,好“米”不錯過

這篇文章主要介紹了Mysql事務(wù)特性和級別原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

一、什么是事務(wù)?

數(shù)據(jù)庫事務(wù)(簡稱:事務(wù))是數(shù)據(jù)庫管理系統(tǒng)執(zhí)行過程中的一個邏輯單位,由一個有限的數(shù)據(jù)庫操作序列構(gòu)成。

二、事務(wù)的四大屬性

分別是原子性、一致性、隔離性、持久性。

1、原子性(Atomicity)

原子性是指事務(wù)包含的所有操作要么全部成功,要么全部失敗回滾,因此事務(wù)的操作如果成功就必須要完全應(yīng)用到數(shù)據(jù)庫,如果操作失敗則不能對數(shù)據(jù)庫有任何影響。

2、一致性(Consistency)

一致性是指事務(wù)必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另一個一致性狀態(tài),也就是說一個事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)。舉例來說,假設(shè)用戶A和用戶B兩者的錢加起來一共是1000,那么不管A和B之間如何轉(zhuǎn)賬、轉(zhuǎn)幾次賬,事務(wù)結(jié)束后兩個用戶的錢相加起來應(yīng)該還得是1000,這就是事務(wù)的一致性。

3、隔離性(Isolation)

隔離性是當(dāng)多個用戶并發(fā)訪問數(shù)據(jù)庫時,比如同時操作同一張表時,數(shù)據(jù)庫為每一個用戶開啟的事務(wù),不能被其他事務(wù)的操作所干擾,多個并發(fā)事務(wù)之間要相互隔離。關(guān)于事務(wù)的隔離性數(shù)據(jù)庫提供了多種隔離級別,稍后會介紹到。

4、持久性(Durability)

持久性是指一個事務(wù)一旦被提交了,那么對數(shù)據(jù)庫中的數(shù)據(jù)的改變就是永久性的,即便是在數(shù)據(jù)庫系統(tǒng)遇到故障的情況下也不會丟失提交事務(wù)的操作。例如我們在使用JDBC操作數(shù)據(jù)庫時,在提交事務(wù)方法后,提示用戶事務(wù)操作完成,當(dāng)我們程序執(zhí)行完成直到看到提示后,就可以認(rèn)定事務(wù)已經(jīng)正確提交,即使這時候數(shù)據(jù)庫出現(xiàn)了問題,也必須要將我們的事務(wù)完全執(zhí)行完成。否則的話就會造成我們雖然看到提示事務(wù)處理完畢,但是數(shù)據(jù)庫因為故障而沒有執(zhí)行事務(wù)的重大錯誤。這是不允許的。

三、mysql隔離級別

READ UNCOMMITTED(未提交讀)

在未提交讀這個事務(wù)級別中,一個事務(wù)可以讀取到另外一個事務(wù)未提交的數(shù)據(jù).

例如 A 事務(wù)更新了一個字段,但是未提交在 B 事務(wù)中,讀取id為1000的記錄的name字段的時候,name的值為'aaa',可是 A 事務(wù)并沒有commit,所以name = 'aaa'有可能是會被回滾的,那么,A 事務(wù)讀取了未提交事務(wù)的數(shù)據(jù)稱為臟讀(Dirty Read)

READ COMMITTED(提交讀)

提交讀這個事務(wù)級別中,一個事務(wù)可以讀取到另外一個事務(wù)提交之后的數(shù)據(jù).

例如 A 事務(wù)讀取到了id為1000的記錄的name字段為aaa ,然后 B 事務(wù)這個時候更新了這條記錄的name值,并且提交了,這個時候 A 事務(wù)再次讀取name的話,name的值就是bbb了,所以在一個事務(wù)中,對一個字段進(jìn)行多次讀取,可能得到的值不同.

A事務(wù)前后兩次讀取的值不一致!

REPEATABLE READ(可重復(fù)讀)

可重復(fù)讀這個事務(wù)級別中,一個事務(wù)重復(fù)去讀的字段不會改變.

例如 A 事務(wù)讀取到了id為1000的記錄的name值為aaa,然后 B 事務(wù)中把name改成了bbb,并且 B 事務(wù)提交了,A 事務(wù)再次去讀name的時候并不會讀取到bbb,所以 A 事務(wù)相當(dāng)于在一個獨立的世界,外界的任何改動不會影響 A 事務(wù).

但是,可重復(fù)讀會導(dǎo)致幻讀出現(xiàn),什么是幻讀呢,舉個例子:

A 事務(wù)查詢一個表,表里只有一條記錄,id為1,但是這個時候 B 事務(wù)插入了一條數(shù)據(jù),id為2,A 事務(wù)因為不知道有id為2的數(shù)據(jù),所以這個時候A也插入了一條id為2的數(shù)據(jù),這個時候肯定會插入失敗.這種情況就是幻讀

備注: MYSQL中的innoDB通過MVCC(多版本并發(fā)控制)解決了幻讀,另外MYSQL的默認(rèn)事務(wù)級別就是可重復(fù)讀,Oracle和SQL Server 默認(rèn)隔離級別為 已提交讀(Read committed)

SERIALIZABLE(可串行化)

可串行化事務(wù)級別,把讀取的每一行數(shù)據(jù)都加了鎖

加鎖了的有點就是,避免了臟讀和幻讀,另外還避免了不可重復(fù)讀的可能性,但是因為加鎖了,減少了很大的并發(fā)性,因為同一時刻,只有一個線程能夠獲取到鎖.還可能導(dǎo)致大量超時問題.

小結(jié):不可重復(fù)讀的和幻讀很容易混淆,不可重復(fù)讀側(cè)重于修改,幻讀側(cè)重于新增或刪除。解決不可重復(fù)讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表

隔離級別:

級別越高,數(shù)據(jù)越安全,但性能越低。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

來源:腳本之家

鏈接:https://www.jb51.net/article/201676.htm

申請創(chuàng)業(yè)報道,分享創(chuàng)業(yè)好點子。點擊此處,共同探討創(chuàng)業(yè)新機遇!

相關(guān)標(biāo)簽
mysql

相關(guān)文章

  • MySQL5.7 集群配置的步驟

    這篇文章主要介紹了MySQL5.7集群配置的步驟,幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下

    標(biāo)簽:
    mysql
  • MySQL中觸發(fā)器和游標(biāo)的介紹與使用

    這篇文章主要給大家介紹了關(guān)于MySQL中觸發(fā)器和游標(biāo)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

    標(biāo)簽:
    mysql
  • MySQL中exists、in及any的基本用法

    這篇文章主要給大家介紹了關(guān)于MySQL中exists、in及any的基本用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

    標(biāo)簽:
    mysql
  • MySQL正確修改最大連接數(shù)的3種方案

    這篇文章主要給大家介紹了關(guān)于MySQL正確修改最大連接數(shù)的3種方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

    標(biāo)簽:
    mysql
  • 教你怎么在Windows系統(tǒng)上手動搭建MySql數(shù)據(jù)庫

    1.已經(jīng)購買好的騰訊云輕量應(yīng)用服務(wù)器。2.作者本次演示使用的系統(tǒng)是WindowsServer2019,其他windows版本也可以,操作流程大同小異。3.使用Windows遠(yuǎn)程桌面連接騰訊云輕量服務(wù)器。

熱門排行

信息推薦