最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

InnoDB引擎中的事務(wù)詳解

 更新時(shí)間:2023年09月11日 11:10:58   作者:silmeweed  
這篇文章主要介紹了InnoDB引擎中的事務(wù)詳解,事務(wù)Transaction是訪問和更新數(shù)據(jù)庫的程序執(zhí)行單元;事務(wù)中可能包含一個(gè)或多個(gè)sql語句,這些語句要么都執(zhí)行,要么都不執(zhí)行,需要的朋友可以參考下

一、事務(wù)

事務(wù)(Transaction)是訪問和更新數(shù)據(jù)庫的程序執(zhí)行單元;事務(wù)中可能包含一個(gè)或多個(gè)sql語句,這些語句要么都執(zhí)行,要么都不執(zhí)行。MySQL中默認(rèn)采用的是自動(dòng)提交(autocommit),在自動(dòng)提交模式下,如果沒有start transaction顯式地開始一個(gè)事務(wù),那么每個(gè)sql語句都會(huì)被當(dāng)做一個(gè)事務(wù)執(zhí)行提交操作。

start transaction;   #1.開始事務(wù)
……  #一條或多條sql語句
commit; #2.提交事務(wù)

1.自動(dòng)提交(autocommit)

可以關(guān)閉autocommit(set autocommit = 0);需要注意的是,autocommit參數(shù)是針對(duì)連接的,在一個(gè)連接中修改了參數(shù),不會(huì)對(duì)其他連接產(chǎn)生影響。如果關(guān)閉了autocommit,則所有的sql語句都在一個(gè)事務(wù)中,直到執(zhí)行了commit或rollback,該事務(wù)結(jié)束,同時(shí)開始了另外一個(gè)事務(wù)。

2. 特殊操作

在MySQL中,存在一些特殊的命令,如果在事務(wù)中執(zhí)行了這些命令,會(huì)馬上強(qiáng)制執(zhí)行commit提交事務(wù);如DDL語句(create table/drop table/alter/table)、lock tables語句等等。不過,常用的select、insert、update和delete命令,都不會(huì)強(qiáng)制提交事務(wù)。

二、事務(wù)的ACID特性

1.原子性(Atomicity):

1.1.定義

指的是整個(gè)事務(wù)要么全部成功,要么全部失敗,如果事務(wù)中一個(gè)sql語句執(zhí)行失敗,則已執(zhí)行的語句rollback也必須回滾,數(shù)據(jù)庫退回到事務(wù)前的狀態(tài)。

1.2.實(shí)現(xiàn)原理:undo log

InnoDB通過undolog保證rollback的時(shí)候能找到之前的數(shù)據(jù)。生成的undo log中會(huì)包含被修改行的主鍵(知道修改了哪些行)、修改了哪些列、這些列在修改前后的值等信息。當(dāng)事務(wù)回滾時(shí)能夠撤銷所有已經(jīng)成功執(zhí)行的sql語句。InnoDB實(shí)現(xiàn)回滾,靠的是undo log:當(dāng)事務(wù)對(duì)數(shù)據(jù)庫進(jìn)行修改時(shí),InnoDB會(huì)生成對(duì)應(yīng)的undo log;如果事務(wù)執(zhí)行失敗或調(diào)用了rollback,導(dǎo)致事務(wù)需要回滾,便可以利用undo log中的信息將數(shù)據(jù)回滾到修改之前的樣子。對(duì)于每個(gè)insert,回滾時(shí)會(huì)執(zhí)行delete;對(duì)于每個(gè)delete,回滾時(shí)會(huì)執(zhí)行insert;對(duì)于每個(gè)update,回滾時(shí)會(huì)執(zhí)行一個(gè)相反的update,把數(shù)據(jù)改回去。

2.一致性(Consistency):

2.1 定義:

一致性是指事務(wù)執(zhí)行結(jié)束后,數(shù)據(jù)庫的完整性約束沒有被破壞,事務(wù)執(zhí)行的前后都是合法的數(shù)據(jù)狀態(tài)

2.2 實(shí)現(xiàn)原理

主要通過crash recovery和double write buffer的機(jī)制保證數(shù)據(jù)的一致性。

3.隔離性(Isolation):

3.1 定義:

隔離性是指,事務(wù)內(nèi)部的操作與其他事務(wù)是隔離的,并發(fā)執(zhí)行的各個(gè)事務(wù)之間不能互相干擾。隔離是不同事務(wù)之間的相互影響。

(1)隔離級(jí)別:

讀未提交在并發(fā)時(shí)會(huì)導(dǎo)致很多問題,而性能相對(duì)于其他隔離級(jí)別提高卻很有限,因此使用較少??纱谢瘡?qiáng)制事務(wù)串行,并發(fā)效率很低,因此使用也較少。因此在大多數(shù)數(shù)據(jù)庫系統(tǒng)中,默認(rèn)的隔離級(jí)別是讀已提交(如Oracle)或可重復(fù)讀(InnoDB)(后文簡(jiǎn)稱RR),可分全局隔離級(jí)別和本次會(huì)話的隔離級(jí)別。

(2)隔離性可以分為兩個(gè)方面:

  • (一個(gè)事務(wù))寫操作對(duì)(另一個(gè)事務(wù))寫操作的影響:鎖機(jī)制保證 (寫與寫)隔離性
  • (一個(gè)事務(wù))寫操作對(duì)(另一個(gè)事務(wù))讀操作的影響:MVCC保證 (寫與讀)隔離性

隔離性要求同一時(shí)刻只能有一個(gè)事務(wù)對(duì)數(shù)據(jù)進(jìn)行寫操作,InnoDB通過鎖機(jī)制來保證這一點(diǎn)。行鎖則只鎖定需要操作的數(shù)據(jù),但是由于加鎖本身需要消耗資源(獲得鎖、檢查鎖、釋放鎖等都需要消耗資源),因此在鎖定數(shù)據(jù)較多情況下使用表鎖可以節(jié)省大量資源。RR是無法避免幻讀問題的,所以InnoDB引入MVVC實(shí)現(xiàn)的RR避免了幻讀問題。

3.2臟讀、不可重復(fù)讀和幻讀

(1)臟讀:

當(dāng)前事務(wù)(A)中可以讀到其他事務(wù)(B)未提交的數(shù)據(jù)(臟數(shù)據(jù)),這種現(xiàn)象是臟讀。

(2)不可重復(fù)讀:

在事務(wù)A中先后兩次讀取同一個(gè)數(shù)據(jù),兩次讀取的結(jié)果不一樣,這種現(xiàn)象稱為不可重復(fù)讀。臟讀與不可重復(fù)讀的區(qū)別在于:前者讀到的是其他事務(wù)未提交的數(shù)據(jù),后者讀到的是其他事務(wù)已提交的數(shù)據(jù)。

(3)幻讀:

在事務(wù)A中按照某個(gè)條件先后兩次查詢數(shù)據(jù)庫,兩次查詢結(jié)果的條數(shù)不同,這種現(xiàn)象稱為幻讀。不可重復(fù)讀與幻讀的區(qū)別可以通俗的理解為:前者是數(shù)據(jù)變了,后者是數(shù)據(jù)的行數(shù)變了。

3.3 MVVC多版本的并發(fā)控制

MVCC的特點(diǎn):在同一時(shí)刻,不同的事務(wù)讀取到的數(shù)據(jù)可能是不同的(即多版本),事務(wù)A和事務(wù)C可以讀取到不同版本的數(shù)據(jù)。

MVCC最大的優(yōu)點(diǎn)是讀不加鎖,因此讀寫不沖突,多個(gè)版本的數(shù)據(jù)可以共存,主要基于以下技術(shù)及數(shù)據(jù)結(jié)構(gòu):

1)隱藏列:InnoDB中每行數(shù)據(jù)都有隱藏列,隱藏列中包含了本行數(shù)據(jù)的事務(wù)id、指向undo log的指針等。

2)基于undo log的版本鏈:前面說到每行數(shù)據(jù)的隱藏列中包含了指向undo log的指針,而每條undo log也會(huì)指向更早版本的undo log,從而形成一條版本鏈。

3)ReadView:指事務(wù)(記做事務(wù)A)在某一時(shí)刻給整個(gè)事務(wù)系統(tǒng)(trx_sys)打快照,之后再進(jìn)行讀操作時(shí),會(huì)將讀取到的數(shù)據(jù)中的事務(wù)id與trx_sys快照比較,從而判斷數(shù)據(jù)對(duì)該ReadView是否可見,即對(duì)事務(wù)A是否可見。

trx_sys中的主要內(nèi)容,以及判斷可見性的方法如下:

  • low_limit_id:表示生成ReadView時(shí)系統(tǒng)中應(yīng)該分配給下一個(gè)事務(wù)的id。如果數(shù)據(jù)的事務(wù)id大于等于low_limit_id,則對(duì)該ReadView不可見。
  • up_limit_id:表示生成ReadView時(shí)當(dāng)前系統(tǒng)中活躍的讀寫事務(wù)中最小的事務(wù)id。如果數(shù)據(jù)的事務(wù)id小于up_limit_id,則對(duì)該ReadView可見。
  • rw_trx_ids:表示生成ReadView時(shí)當(dāng)前系統(tǒng)中活躍的讀寫事務(wù)的事務(wù)id列表。如果數(shù)據(jù)的事務(wù)id在low_limit_id和up_limit_id之間,則需要判斷事務(wù)id是否在rw_trx_ids中:如果在,說明生成ReadView時(shí)事務(wù)仍在活躍中,因此數(shù)據(jù)對(duì)ReadView不可見;如果不在,說明生成ReadView時(shí)事務(wù)已經(jīng)提交了,因此數(shù)據(jù)對(duì)ReadView可見。

3.4. 鎖機(jī)制

兩個(gè)事務(wù)的寫操作之間的相互影響。隔離性要求同一時(shí)刻只能有一個(gè)事務(wù)對(duì)數(shù)據(jù)進(jìn)行寫操作,InnoDB通過鎖機(jī)制來保證這一點(diǎn)。鎖機(jī)制的基本原理可以概括為:事務(wù)在修改數(shù)據(jù)之前,需要先獲得相應(yīng)的鎖;獲得鎖之后,事務(wù)便可以修改數(shù)據(jù);該事務(wù)操作期間,這部分?jǐn)?shù)據(jù)是鎖定的,其他事務(wù)如果需要修改數(shù)據(jù),需要等待當(dāng)前事務(wù)提交或回滾后釋放鎖。

行鎖與表鎖

表鎖在操作數(shù)據(jù)時(shí)會(huì)鎖定整張表,并發(fā)性能較差;行鎖則只鎖定需要操作的數(shù)據(jù),并發(fā)性能好。MyIsam只支持表鎖,而InnoDB同時(shí)支持表鎖和行鎖,且出于性能考慮,絕大多數(shù)情況下使用的都是行鎖。

如何查看鎖信息

有多種方法可以查看InnoDB中鎖的情況,例如:

select * from information_schema.innodb_locks; #鎖的概況
show engine innodb status; #InnoDB整體狀態(tài),其中包括鎖的情況

下面來看一個(gè)例子:

#在事務(wù)A中執(zhí)行:
start transaction;
update account SET balance = 1000 where id = 1;
#在事務(wù)B中執(zhí)行:
start transaction;
update account SET balance = 2000 where id = 1;

此時(shí)查看鎖的情況:

show engine innodb status查看鎖相關(guān)的部分:

通過上述命令可以查看事務(wù)24052和24053占用鎖的情況;其中l(wèi)ock_type為RECORD,代表鎖為行鎖(記錄鎖);lock_mode為X,代表排它鎖(寫鎖)。

4.持久性(Durability):

4.1 定義:

數(shù)據(jù)在事務(wù)commit 后在任何情況下都不能丟。InnoDB通過redolog保證已經(jīng)commit的數(shù)據(jù)一定不會(huì)丟失。

4.2實(shí)現(xiàn)原理:redo log

redo log存在背景:

InnoDB Buffer Pool中包含了磁盤中部分?jǐn)?shù)據(jù)頁的映射,當(dāng)向數(shù)據(jù)庫寫入數(shù)據(jù)時(shí),會(huì)首先寫入Buffer Pool。Buffer Pool中修改的數(shù)據(jù)會(huì)定期刷新到磁盤中(這一過程稱為刷臟)。但是也帶了新的問題:如果MySQL宕機(jī),而此時(shí)Buffer Pool中修改的數(shù)據(jù)還沒有刷新到磁盤,就會(huì)導(dǎo)致數(shù)據(jù)的丟失,事務(wù)的持久性無法保證。

redo log被引入來解決這個(gè)問題:當(dāng)數(shù)據(jù)修改時(shí),除了修改Buffer Pool中的數(shù)據(jù),還會(huì)在redo log記錄這次操作;當(dāng)事務(wù)提交時(shí),會(huì)調(diào)用fsync接口對(duì)redo log進(jìn)行刷盤。如果MySQL宕機(jī),重啟時(shí)可以讀取redo log中的數(shù)據(jù),對(duì)數(shù)據(jù)庫進(jìn)行恢復(fù)。redo log采用的是WAL(Write-ahead logging,預(yù)寫式日志),所有修改先寫入日志,再更新到Buffer Pool,保證了數(shù)據(jù)不會(huì)因MySQL宕機(jī)而丟失,從而滿足了持久性要求。

既然redo log也需要在事務(wù)提交時(shí)將日志寫入磁盤,為什么它比直接將Buffer Pool中修改的數(shù)據(jù)寫入磁盤(即刷臟)要快呢?主要有以下兩方面的原因:

(1)刷臟是隨機(jī)IO,因?yàn)槊看涡薷牡臄?shù)據(jù)位置隨機(jī),但寫redo log是追加操作,屬于順序IO。

(2)刷臟是以數(shù)據(jù)頁(Page)為單位的,MySQL默認(rèn)頁大小是16KB,一個(gè)Page上一個(gè)小修改都要整頁寫入;而redo log中只包含真正需要寫入的部分,無效IO大大減少。

到此這篇關(guān)于InnoDB引擎中的事務(wù)詳解的文章就介紹到這了,更多相關(guān)InnoDB事務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解MySQL開啟遠(yuǎn)程連接權(quán)限

    詳解MySQL開啟遠(yuǎn)程連接權(quán)限

    這篇文章主要介紹了MySQL開啟遠(yuǎn)程連接權(quán)限,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • MySQL查詢重寫如何把復(fù)雜查詢變簡(jiǎn)單詳解

    MySQL查詢重寫如何把復(fù)雜查詢變簡(jiǎn)單詳解

    MySQL查詢重寫是自動(dòng)優(yōu)化SQL查詢的過程,通過調(diào)整查詢結(jié)構(gòu)和執(zhí)行計(jì)劃,提高查詢性能,減少資源消耗,這篇文章主要介紹了MySQL查詢重寫如何把復(fù)雜查詢變簡(jiǎn)單的相關(guān)資料,需要的朋友可以參考下
    2025-05-05
  • 基于MySQL在磁盤上存儲(chǔ)NULL值

    基于MySQL在磁盤上存儲(chǔ)NULL值

    這篇文章主要介紹了基于MySQL在磁盤上存儲(chǔ)NULL值,NULL值列表,一行數(shù)據(jù)里可能有的字段值是NULL,比如nickname字段,允許為NULL,存儲(chǔ)時(shí),如果沒賦值,這字段值就是NULL,下文關(guān)于NULL值的相關(guān)資料,需要的小伙伴可以參考一下
    2022-02-02
  • MySQL之JDBC編程用法及說明

    MySQL之JDBC編程用法及說明

    文章介紹了JDBC的概念、特點(diǎn)和工作流程,提供了開發(fā)環(huán)境的準(zhǔn)備工作,并詳細(xì)講解了JDBC的核心API,包括DriverManager、DataSource、Connection、Statement、PreparedStatement和ResultSet,此外,還討論了SQL注入的問題及解決方案,并給出了完整代碼示例
    2026-05-05
  • MySQL數(shù)據(jù)庫全方位優(yōu)化指南(從硬件到架構(gòu)的深度調(diào)優(yōu))

    MySQL數(shù)據(jù)庫全方位優(yōu)化指南(從硬件到架構(gòu)的深度調(diào)優(yōu))

    MySQL作為全球最流行的開源關(guān)系型數(shù)據(jù)庫,廣泛應(yīng)用于電商、論壇、博客等各類業(yè)務(wù)場(chǎng)景,MySQL優(yōu)化是一個(gè)從硬件到軟件、從配置到架構(gòu)的系統(tǒng)性工程,本文介紹MySQL數(shù)據(jù)庫全方位優(yōu)化指南,感興趣的朋友一起看看吧
    2025-11-11
  • MySQL優(yōu)化器的SQL重寫規(guī)則介紹

    MySQL優(yōu)化器的SQL重寫規(guī)則介紹

    這篇文章主要介紹了MySQL優(yōu)化器的SQL重寫規(guī)則,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Mysql 8.0安裝及重置密碼問題

    Mysql 8.0安裝及重置密碼問題

    這篇文章主要介紹了Mysql 8.0安裝及重置密碼問題,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-11-11
  • MySql的事務(wù)使用與示例詳解

    MySql的事務(wù)使用與示例詳解

    這篇文章主要介紹了MySqld的事務(wù)用法,需要的朋友可以參考下
    2014-06-06
  • MySQL 去除重復(fù)數(shù)據(jù)實(shí)例詳解

    MySQL 去除重復(fù)數(shù)據(jù)實(shí)例詳解

    這篇文章主要介紹了MySQL 去除重復(fù)數(shù)據(jù)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • MySQL之MyISAM存儲(chǔ)引擎的非聚簇索引詳解

    MySQL之MyISAM存儲(chǔ)引擎的非聚簇索引詳解

    這篇文章主要為大家詳細(xì)介紹了MySQL之MyISAM存儲(chǔ)引擎的非聚簇索引,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03

最新評(píng)論

安塞县| 任丘市| 抚远县| 邹城市| 同心县| 肥东县| 巴南区| 易门县| 大渡口区| 三明市| 玉田县| 合山市| 大同市| 九江县| 奉节县| 游戏| 茂名市| 济阳县| 农安县| 资中县| 曲靖市| 元氏县| 安国市| 浙江省| 虞城县| 射洪县| 桂平市| 佛冈县| 临泽县| 桃江县| 沂源县| 菏泽市| 尤溪县| 剑川县| 安顺市| 仁寿县| 陇南市| 东兴市| 长治县| 凯里市| 昌邑市|