這篇文章主要為大家分享數(shù)據(jù)庫事務(wù)的四大特性,特性包括:原子性、隔離性、永久性、一致性,接下來為大家介紹這四大特性的定義和在 InnoDB 引擎中的實(shí)現(xiàn)。
創(chuàng)新互聯(lián)建站主營南寧網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,app開發(fā)定制,南寧h5小程序開發(fā)搭建,南寧網(wǎng)站營銷推廣歡迎南寧等地區(qū)企業(yè)咨詢
一次操作是不可分割的,要么全部成功,要么全部失敗。比如我們的轉(zhuǎn)賬操作,不允許出款方成功,收款方失敗這種情況,要么都成功,要么多失敗,不可能出現(xiàn)中間狀態(tài)。
InnoDB 引擎使用 undo log(歸滾日志)來保證原子性操作,你對(duì)數(shù)據(jù)庫的每一條數(shù)據(jù)的改動(dòng)(INSERT、DELETE、UPDATE)都會(huì)被記錄到 undo log 中,比如以下這些操作:
當(dāng)事務(wù)執(zhí)行失敗或者調(diào)用了 rollback 方法時(shí),就會(huì)觸發(fā)回滾事件,利用 undo log 中記錄將數(shù)據(jù)回滾到修改之前的樣子。
更多關(guān)于 undo log 的信息,后面再單獨(dú)開一篇文章打卡。
多個(gè)事務(wù)并發(fā)執(zhí)行的時(shí)候,事務(wù)內(nèi)部的操作與其他事務(wù)是隔離的,并發(fā)執(zhí)行的各個(gè)事務(wù)之間不能互相干擾。
隔離性可能會(huì)引入臟讀(dirty read)、不可重復(fù)讀(non-repeatable read)、幻讀(phantom read)等問題,為了解決這些問題就引入了“隔離級(jí)別”的概念。
SQL 標(biāo)準(zhǔn)的事務(wù)隔離級(jí)別包括:讀未提交(read uncommitted)、讀提交(read committed)、可重復(fù)讀(repeatable read)和串行化(serializable):
SQL標(biāo)準(zhǔn)中規(guī)定,針對(duì)不同的隔離級(jí)別,并發(fā)事務(wù)可以發(fā)生不同嚴(yán)重程度的問題,具體情況如下:
隔離級(jí)別 | 臟讀 | 不可重復(fù)讀 | 幻讀 |
---|---|---|---|
讀未提交 | 可能 | 可能 | 可能 |
讀提交 | 不可能 | 可能 | 可能 |
可重復(fù)讀 | 不可能 | 不可能 | 可能 |
串行化 | 不可能 | 不可能 | 不可能 |
上面就是幾種隔離級(jí)別可能出現(xiàn)的并發(fā)問題,但是有必要說一下,你隔離得越嚴(yán)實(shí),效率就會(huì)越低。
InnoDB 引擎是如何保證隔離性的?利用鎖和 MVCC 機(jī)制。這里簡單的介紹一下 MVCC 機(jī)制,也叫多版本并發(fā)控制,在使用 READ COMMITTD、REPEATABLE READ 這兩種隔離級(jí)別的事務(wù)下,每條記錄在更新的時(shí)候都會(huì)同時(shí)記錄一條回滾操作,就會(huì)形成一個(gè)版本鏈,在執(zhí)行普通的 SELECT 操作時(shí)訪問記錄的版本鏈的過程,這樣子可以使不同事務(wù)的讀-寫、寫-讀操作并發(fā)執(zhí)行,從而提升系統(tǒng)性能。
事務(wù)一旦提交,它對(duì)數(shù)據(jù)庫的改變就應(yīng)該是永久性的。接下來的其他操作或故障不應(yīng)該對(duì)其有任何影響。
要保證持久性很簡單,就是每次事務(wù)提交的時(shí)候,都將數(shù)據(jù)刷磁盤上,這樣一定保證了安全性,但是要知道如果每次事務(wù)提交都將數(shù)據(jù)寫入到磁盤的話,頻繁的 IO 操作,成本太高,數(shù)據(jù)庫的性能極低,所以這種方式不可取。
InnoDB 引擎是怎么解決的?InnoDB 引擎引入了一個(gè)中間層來解決這個(gè)持久性的問題,我們把這個(gè)叫做 redo log(歸檔日志)。
為什么要引入 redo log?redo log 可以保證持久化又可以保證數(shù)據(jù)庫的性能,相比于直接刷盤,redo log 有以下兩個(gè)優(yōu)勢(shì):
InnoDB 引擎是怎么做的?當(dāng)有一條記錄需要更新的時(shí)候,InnoDB 引擎就會(huì)先把記錄寫到 redo log 里面,并更新內(nèi)存,這個(gè)時(shí)候更新就算完成了。當(dāng)數(shù)據(jù)庫宕機(jī)重啟的時(shí)候,會(huì)將 redo log 中的內(nèi)容恢復(fù)到數(shù)據(jù)庫中,再根據(jù) undo log和 binlog 內(nèi)容決定回滾數(shù)據(jù)還是提交數(shù)據(jù)。
更多 redo log,后面我打算單獨(dú)寫一篇文章。
一致性簡單一點(diǎn)說就是數(shù)據(jù)執(zhí)行前后都要處于一種合法的狀態(tài),比如身份證號(hào)不能重復(fù),性別只能是男或者女,高考的分?jǐn)?shù)只能在0~750之間,紅綠燈只有3種顏色,房價(jià)不能為負(fù)的等等, 只有符合這些約束的數(shù)據(jù)才是有效的,比如有個(gè)小孩兒跟你說他高考考了1000分,你一聽就知道他胡扯呢。數(shù)據(jù)庫世界只是現(xiàn)實(shí)世界的一個(gè)映射,現(xiàn)實(shí)世界中存在的約束當(dāng)然也要在數(shù)據(jù)庫世界中有所體現(xiàn)。如果數(shù)據(jù)庫中的數(shù)據(jù)全部符合現(xiàn)實(shí)世界中的約束(all defined rules),我們說這些數(shù)據(jù)就是一致的,或者說符合一致性的。
要保證數(shù)據(jù)庫的數(shù)據(jù)一致性,要在以下兩個(gè)方面做努力:
NOT NULL
來拒絕NULL
值得插入等。
名稱欄目:如何在InnoDB中實(shí)現(xiàn)事務(wù)的四大特性
文章路徑:http://sd-ha.com/article28/pepicp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、云服務(wù)器、用戶體驗(yàn)、Google、網(wǎng)頁設(shè)計(jì)公司、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)