偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

你可能知道事務(wù)的四大特性,但是你不一定知道事務(wù)的實(shí)現(xiàn)原理

運(yùn)維 數(shù)據(jù)庫運(yùn)維
說到數(shù)據(jù)庫,那就一定會聊到事務(wù),事務(wù)也是面試中常問的問題,我們先來一個面試場景。

 [[311740]]

說到數(shù)據(jù)庫,那就一定會聊到事務(wù),事務(wù)也是面試中常問的問題,我們先來一個面試場景:

面試官:"事務(wù)的四大特性是什么?"我:"ACID,即原子性(Atomicity)、隔離性(Isolation)、持久性(Durability)、一致性(Consistency)!"面試官:"在 MySQL 數(shù)據(jù)庫的 InnoDB 引擎是怎么實(shí)現(xiàn)這四大特性的?"我:"這個...這個....,還真沒有了解過哎"面試官:"那我們就先這個吧,先回去吧,我們會通知你的~"

這可能是比較常見的面試場景了,你也許回答到了事務(wù)的四大特性,但是不一定知道他的實(shí)現(xiàn)原理。今天我們就來一起打卡事務(wù)的四大特性和實(shí)現(xiàn)原理,對于原理的實(shí)現(xiàn),這篇文章只是粗略的介紹一下,更多的細(xì)節(jié)可以關(guān)注我后續(xù)的文章。

數(shù)據(jù)庫的事務(wù)有四大特性:原子性、隔離性、永久性、一致性,下面將介紹這四大特性的定義和在 InnoDB 引擎中是怎么實(shí)現(xiàn)的。

原子性

定義

一次操作是不可分割的,要么全部成功,要么全部失敗。比如我們的轉(zhuǎn)賬操作,不允許出款方成功,收款方失敗這種情況,要么都成功,要么多失敗,不可能出現(xiàn)中間狀態(tài)。

實(shí)現(xiàn)

InnoDB 引擎使用 undo log(歸滾日志)來保證原子性操作,你對數(shù)據(jù)庫的每一條數(shù)據(jù)的改動(INSERT、DELETE、UPDATE)都會被記錄到 undo log 中,比如以下這些操作:

  • 你插入一條記錄時,至少要把這條記錄的主鍵值記下來,之后回滾的時候只需要把這個主鍵值對應(yīng)的記錄刪掉就好了。
  • 你刪除了一條記錄,至少要把這條記錄中的內(nèi)容都記下來,這樣之后回滾時再把由這些內(nèi)容組成的記錄插入到表中就好了。
  • 你修改了一條記錄,至少要把修改這條記錄前的舊值都記錄下來,這樣之后回滾時再把這條記錄更新為舊值就好了。

當(dāng)事務(wù)執(zhí)行失敗或者調(diào)用了 rollback 方法時,就會觸發(fā)回滾事件,利用 undo log 中記錄將數(shù)據(jù)回滾到修改之前的樣子。

更多關(guān)于 undo log 的信息,后面再單獨(dú)開一篇文章打卡。

隔離性

定義

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

實(shí)現(xiàn)

隔離性可能會引入臟讀(dirty read)、不可重復(fù)讀(non-repeatable read)、幻讀(phantom read)等問題,為了解決這些問題就引入了“隔離級別”的概念。

SQL 標(biāo)準(zhǔn)的事務(wù)隔離級別包括:讀未提交(read uncommitted)、讀提交(read committed)、可重復(fù)讀(repeatable read)和串行化(serializable):

  • 讀未提交:一個事務(wù)還沒提交時,它做的變更就能被別的事務(wù)看到。
  • 讀提交:一個事務(wù)提交之后,它做的變更才會被其他事務(wù)看到。
  • 可重復(fù)讀: 一個事務(wù)執(zhí)行過程中看到的數(shù)據(jù),總是跟這個事務(wù)在啟動時看到的數(shù)據(jù)是一致的。當(dāng)然在可重復(fù)讀隔離級別下,未提交變更對其他事務(wù)也是不可見的。
  • 串行化: 顧名思義是對于同一行記錄,“寫”會加“寫鎖”,“讀”會加“讀鎖”。當(dāng)出現(xiàn)讀寫鎖沖突的時候,后訪問的事務(wù)必須等前一個事務(wù)執(zhí)行完成,才能繼續(xù)執(zhí)行。

SQL標(biāo)準(zhǔn)中規(guī)定,針對不同的隔離級別,并發(fā)事務(wù)可以發(fā)生不同嚴(yán)重程度的問題,具體情況如下:

上面就是幾種隔離級別可能出現(xiàn)的并發(fā)問題,但是有必要說一下,你隔離得越嚴(yán)實(shí),效率就會越低。

InnoDB 引擎是如何保證隔離性的?利用鎖和 MVCC 機(jī)制。這里簡單的介紹一下 MVCC 機(jī)制,也叫多版本并發(fā)控制,在使用 READ COMMITTD、REPEATABLE READ 這兩種隔離級別的事務(wù)下,每條記錄在更新的時候都會同時記錄一條回滾操作,就會形成一個版本鏈,在執(zhí)行普通的 SELECT 操作時訪問記錄的版本鏈的過程,這樣子可以使不同事務(wù)的讀-寫、寫-讀操作并發(fā)執(zhí)行,從而提升系統(tǒng)性能。

持久性

定義

事務(wù)一旦提交,它對數(shù)據(jù)庫的改變就應(yīng)該是永久性的。接下來的其他操作或故障不應(yīng)該對其有任何影響。

實(shí)現(xiàn)

要保證持久性很簡單,就是每次事務(wù)提交的時候,都將數(shù)據(jù)刷磁盤上,這樣一定保證了安全性,但是要知道如果每次事務(wù)提交都將數(shù)據(jù)寫入到磁盤的話,頻繁的 IO 操作,成本太高,數(shù)據(jù)庫的性能極低,所以這種方式不可取。

InnoDB 引擎是怎么解決的?InnoDB 引擎引入了一個中間層來解決這個持久性的問題,我們把這個叫做 redo log(歸檔日志)。

為什么要引入 redo log?redo log 可以保證持久化又可以保證數(shù)據(jù)庫的性能,相比于直接刷盤,redo log 有以下兩個優(yōu)勢:

  • redo log體積小,畢竟只記錄了哪一頁修改了啥,因此體積小,刷盤快。
  • redo log是一直往末尾進(jìn)行追加,屬于順序IO。效率顯然比隨機(jī)IO來的快。

InnoDB 引擎是怎么做的?當(dāng)有一條記錄需要更新的時候,InnoDB 引擎就會先把記錄寫到 redo log 里面,并更新內(nèi)存,這個時候更新就算完成了。當(dāng)數(shù)據(jù)庫宕機(jī)重啟的時候,會將 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),比如身份證號不能重復(fù),性別只能是男或者女,高考的分?jǐn)?shù)只能在0~750之間,紅綠燈只有3種顏色,房價不能為負(fù)的等等, 只有符合這些約束的數(shù)據(jù)才是有效的,比如有個小孩兒跟你說他高考考了1000分,你一聽就知道他胡扯呢。數(shù)據(jù)庫世界只是現(xiàn)實(shí)世界的一個映射,現(xiàn)實(shí)世界中存在的約束當(dāng)然也要在數(shù)據(jù)庫世界中有所體現(xiàn)。如果數(shù)據(jù)庫中的數(shù)據(jù)全部符合現(xiàn)實(shí)世界中的約束(all defined rules),我們說這些數(shù)據(jù)就是一致的,或者說符合一致性的。

實(shí)現(xiàn)

要保證數(shù)據(jù)庫的數(shù)據(jù)一致性,要在以下兩個方面做努力:

  • 利用數(shù)據(jù)庫的一些特性來保證部分一致性需求:比如聲明某個列為NOT NULL 來拒絕NULL值得插入等。
  • 絕大部分還是需要我們程序員在編寫業(yè)務(wù)代碼得時候來保證。

 

責(zé)任編輯:華軒 來源: 平頭哥的技術(shù)博文
相關(guān)推薦

2022-12-26 09:16:45

Guava架構(gòu)模型

2021-02-26 09:04:22

數(shù)組ArrayListHashMap

2020-07-29 07:37:20

Git 修復(fù)項(xiàng)目

2024-03-21 17:29:45

2016-11-28 11:19:48

術(shù)語神秘

2021-11-16 07:31:59

JavaJDK 7 String

2021-01-14 10:38:41

Java枚舉工具

2020-04-27 10:34:23

HTTPDNSDNS網(wǎng)絡(luò)協(xié)議

2021-02-25 15:19:04

文件App蘋果功能

2021-05-07 20:08:52

人工智能AI游戲

2021-05-08 16:33:14

人工智能游戲機(jī)器學(xué)習(xí)

2018-02-08 09:11:25

Linux命令rm

2020-08-30 14:31:40

Python編程語言開發(fā)

2018-07-17 10:58:45

數(shù)據(jù)庫數(shù)據(jù)庫事務(wù)隔離級別

2019-10-25 21:39:39

服務(wù)器開發(fā)工具

2012-10-16 09:52:27

數(shù)據(jù)結(jié)構(gòu)

2020-09-21 18:44:35

MySQL

2011-10-19 10:07:18

桌面虛擬化云計(jì)算

2022-02-25 08:13:03

物聯(lián)網(wǎng)IOT

2025-05-13 02:10:00

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號