佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > Mysql事務(wù)特性和級(jí)別原理解析

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

熱門(mén)標(biāo)簽:呼叫中心市場(chǎng)需求 AI電銷(xiāo) 百度競(jìng)價(jià)排名 網(wǎng)站排名優(yōu)化 Linux服務(wù)器 服務(wù)外包 鐵路電話系統(tǒng) 地方門(mén)戶網(wǎng)站

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

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

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

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

1、原子性(Atomicity)

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

2、一致性(Consistency)

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

3、隔離性(Isolation)

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

4、持久性(Durability)

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

三、mysql隔離級(jí)別 

READ UNCOMMITTED(未提交讀)

在未提交讀這個(gè)事務(wù)級(jí)別中,一個(gè)事務(wù)可以讀取到另外一個(gè)事務(wù)未提交的數(shù)據(jù).
例如 A 事務(wù)更新了一個(gè)字段,但是未提交在 B 事務(wù)中,讀取id為1000的記錄的name字段的時(shí)候,name的值為'aaa',可是 A 事務(wù)并沒(méi)有commit,所以name = 'aaa'有可能是會(huì)被回滾的,那么,A 事務(wù)讀取了未提交事務(wù)的數(shù)據(jù)稱(chēng)為臟讀(Dirty Read)

READ COMMITTED(提交讀)

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

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

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

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

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

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

但是,可重復(fù)讀會(huì)導(dǎo)致幻讀出現(xiàn),什么是幻讀呢,舉個(gè)例子:
A 事務(wù)查詢一個(gè)表,表里只有一條記錄,id為1,但是這個(gè)時(shí)候 B 事務(wù)插入了一條數(shù)據(jù),id為2,A 事務(wù)因?yàn)椴恢烙衖d為2的數(shù)據(jù),所以這個(gè)時(shí)候A也插入了一條id為2的數(shù)據(jù),這個(gè)時(shí)候肯定會(huì)插入失敗.這種情況就是幻讀

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

SERIALIZABLE(可串行化)

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

加鎖了的有點(diǎn)就是,避免了臟讀和幻讀,另外還避免了不可重復(fù)讀的可能性,但是因?yàn)榧渔i了,減少了很大的并發(fā)性,因?yàn)橥粫r(shí)刻,只有一個(gè)線程能夠獲取到鎖.還可能導(dǎo)致大量超時(shí)問(wèn)題.

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

隔離級(jí)別:

隔離級(jí)別 臟讀(Dirty Read) 不可重復(fù)讀(NonRepeatable Read) 幻讀(Phantom Read)
未提交讀(Read uncommitted) 可能 可能 可能    
已提交讀(Read committed) 不可能 可能 可能
可重復(fù)讀(Repeatable read) 不可能 不可能 可能
可串行化(Serializable ) 不可能 不可能 不可能

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

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

您可能感興趣的文章:
  • 深入理解PHP+Mysql分布式事務(wù)與解決方案
  • 淺析MySQL 鎖和事務(wù)
  • 聊聊MySQL事務(wù)的特性和隔離級(jí)別
  • MySQL 如何使用事務(wù)
  • MySQL如何實(shí)現(xiàn)事務(wù)的ACID
  • MySQL為什么要避免大事務(wù)以及大事務(wù)解決的方法
  • Mysql事務(wù)隔離級(jí)別原理實(shí)例解析
  • MySQL查看和修改事務(wù)隔離級(jí)別的實(shí)例講解

標(biāo)簽:崇左 衡水 仙桃 湖南 蘭州 黃山 湘潭 銅川

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Mysql事務(wù)特性和級(jí)別原理解析》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    霍城县| 泾阳县| 怀宁县| 民权县| 如东县| 华坪县| 元江| 基隆市| 德钦县| 吉水县| 苏尼特右旗| 宝山区| 雷州市| 建昌县| 上栗县| 揭阳市| 彰化县| 汾西县| 昌图县| 农安县| 牡丹江市| 漯河市| 南宁市| 鹤壁市| 高邮市| 高邑县| 中卫市| 双辽市| 遵化市| 永兴县| 额尔古纳市| 浑源县| 蒲城县| 会昌县| 剑川县| 观塘区| 凤山县| 玛沁县| 桃园县| 城固县| 定日县|