国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

數(shù)據(jù)庫底層運(yùn)行原理之——事務(wù)管理器

這篇具有很好參考價(jià)值的文章主要介紹了數(shù)據(jù)庫底層運(yùn)行原理之——事務(wù)管理器。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一般所有關(guān)系型數(shù)據(jù)庫內(nèi)部都有自己的事務(wù)機(jī)制,進(jìn)程是如何保證每個(gè)查詢在自己的事務(wù)內(nèi)執(zhí)行的,通過這篇文章來簡單介紹一下。

我們可以理解為數(shù)據(jù)庫是由多種相互交互的組件構(gòu)成的,數(shù)據(jù)庫一般可以用如下圖形來理解:

數(shù)據(jù)庫底層運(yùn)行原理之——事務(wù)管理器

事務(wù)管理器就是今天要介紹的其中一個(gè)組件:Transaction manager

在講事務(wù)之前,我們需要理解ACID事務(wù)的概念。

一個(gè)ACID事務(wù)是一個(gè)工作單元,它要保證4個(gè)屬性:

  • 原子性Atomicity): 事務(wù)『要么全部完成,要么全部取消』,即使它持續(xù)運(yùn)行10個(gè)小時(shí)。如果事務(wù)崩潰,狀態(tài)回到事務(wù)之前(事務(wù)回滾)。
  • 隔離性Isolation): 如果2個(gè)事務(wù) A 和 B 同時(shí)運(yùn)行,事務(wù) A 和 B 最終的結(jié)果是相同的,不管 A 是結(jié)束于 B 之前/之后/運(yùn)行期間。
  • 持久性Durability): 一旦事務(wù)提交(也就是成功執(zhí)行),不管發(fā)生什么(崩潰或者出錯(cuò)),數(shù)據(jù)要保存在數(shù)據(jù)庫中。
  • 一致性Consistency): 只有合法的數(shù)據(jù)(依照關(guān)系約束和函數(shù)約束)能寫入數(shù)據(jù)庫,一致性與原子性和隔離性有關(guān)。

現(xiàn)代數(shù)據(jù)庫不會使用純粹的隔離作為默認(rèn)模式,因?yàn)樗鼤砭薮蟮男阅芟?。SQL一般定義4個(gè)隔離級別:

  • 串行化(Serializable,SQLite默認(rèn)模式):最高級別的隔離。兩個(gè)同時(shí)發(fā)生的事務(wù)100%隔離,每個(gè)事務(wù)有自己的『世界』。
  • 可重復(fù)讀(Repeatable read,MySQL默認(rèn)模式):每個(gè)事務(wù)有自己的『世界』,除了一種情況。如果一個(gè)事務(wù)成功執(zhí)行并且添加了新數(shù)據(jù),這些數(shù)據(jù)對其他正在執(zhí)行的事務(wù)是可見的。但是如果事務(wù)成功修改了一條數(shù)據(jù),修改結(jié)果對正在運(yùn)行的事務(wù)不可見。所以,事務(wù)之間只是在新數(shù)據(jù)方面突破了隔離,對已存在的數(shù)據(jù)仍舊隔離。 舉個(gè)例子,如果事務(wù)A運(yùn)行”SELECT count(1) from TABLE_X” ,然后事務(wù)B在 TABLE_X 加入一條新數(shù)據(jù)并提交,當(dāng)事務(wù)A再運(yùn)行一次 count(1)結(jié)果不會是一樣的。 這叫幻讀(phantom read)。
  • 讀取已提交(Read committed,Oracle、PostgreSQL、SQL Server默認(rèn)模式):可重復(fù)讀+新的隔離突破。如果事務(wù)A讀取了數(shù)據(jù)D,然后數(shù)據(jù)D被事務(wù)B修改(或刪除)并提交,事務(wù)A再次讀取數(shù)據(jù)D時(shí)數(shù)據(jù)的變化(或刪除)是可見的。 這也叫不可重復(fù)讀(non-repeatable read)。
  • 讀取未提交(Read uncommitted):最低級別的隔離,是讀取已提交+新的隔離突破。如果事務(wù)A讀取了數(shù)據(jù)D,然后數(shù)據(jù)D被事務(wù)B修改(但并未提交,事務(wù)B仍在運(yùn)行中),事務(wù)A再次讀取數(shù)據(jù)D時(shí),數(shù)據(jù)修改是可見的。如果事務(wù)B回滾,那么事務(wù)A第二次讀取的數(shù)據(jù)D是無意義的,因?yàn)槟鞘鞘聞?wù)B所做的從未發(fā)生的修改(已經(jīng)回滾了嘛)。 這也叫臟讀(dirty read)。

默認(rèn)的隔離級別可以由用戶/開發(fā)者在建立連接時(shí)指定,一般mysql默認(rèn)的隔離級別是 可重復(fù)讀?,當(dāng)然,隔離級別越高的話,對應(yīng)的效率是越低的。

并發(fā)控制

確保隔離性、一致性和原子性的真正問題是對相同數(shù)據(jù)的寫操作(增、更、刪):

  • 如果所有事務(wù)只是讀取數(shù)據(jù),它們可以同時(shí)工作,不會更改另一個(gè)事務(wù)的行為。
  • 如果多個(gè)事務(wù)同時(shí)操作同一個(gè)數(shù)據(jù),可能出現(xiàn)事務(wù)A的更改被事務(wù)B或者C所覆蓋等等。

因此在高并發(fā)下要對可能出現(xiàn)的一些問題做?并發(fā)控制。

最簡單的解決辦法是依次執(zhí)行每個(gè)事務(wù)(即順序執(zhí)行),但這樣就完全沒有伸縮性了,在一個(gè)多處理器/多核服務(wù)器上只有一個(gè)核心在工作,效率很低。

為了解決這個(gè)問題,多數(shù)數(shù)據(jù)庫使用和/或數(shù)據(jù)版本控制。

悲觀鎖

原理是:

如果一個(gè)事務(wù)需要一條數(shù)據(jù),它就把數(shù)據(jù)鎖住,如果另一個(gè)事務(wù)也需要這條數(shù)據(jù),它就必須要等第一個(gè)事務(wù)釋放這條數(shù)據(jù) 這個(gè)鎖叫排他鎖。

但是對一個(gè)僅僅讀取數(shù)據(jù)的事務(wù)使用排他鎖非常昂貴,因?yàn)?strong>這會迫使其它只需要讀取相同數(shù)據(jù)的事務(wù)等待。因此就有了另一種鎖,共享鎖。

共享鎖是這樣的:

如果一個(gè)事務(wù)只需要讀取數(shù)據(jù)A,它會給數(shù)據(jù)A加上『共享鎖』并讀取,如果第二個(gè)事務(wù)也需要僅僅讀取數(shù)據(jù)A,它會給數(shù)據(jù)A加上『共享鎖』并讀取,如果第三個(gè)事務(wù)需要修改數(shù)據(jù)A,它會給數(shù)據(jù)A加上『排他鎖』,但是必須等待另外兩個(gè)事務(wù)釋放它們的共享鎖。

同樣的,如果一塊數(shù)據(jù)被加上排他鎖,一個(gè)只需要讀取該數(shù)據(jù)的事務(wù)必須等待排他鎖釋放才能給該數(shù)據(jù)加上共享鎖。

鎖管理器是添加和釋放鎖的進(jìn)程,在內(nèi)部用一個(gè)哈希表保存鎖信息(關(guān)鍵字是被鎖的數(shù)據(jù)),并且了解每一塊數(shù)據(jù)是:

  • 被哪個(gè)事務(wù)加的鎖
  • 哪個(gè)事務(wù)在等待數(shù)據(jù)解鎖

死鎖

使用鎖會導(dǎo)致一種情況,2個(gè)事務(wù)永遠(yuǎn)在等待一塊數(shù)據(jù)

數(shù)據(jù)庫底層運(yùn)行原理之——事務(wù)管理器

如上圖所示:

  • 事務(wù)A 給 數(shù)據(jù)1 加上排他鎖并且等待獲取數(shù)據(jù)2
  • 事務(wù)B 給 數(shù)據(jù)2 加上排他鎖并且等待獲取數(shù)據(jù)1

這叫死鎖

在死鎖發(fā)生時(shí),鎖管理器要選擇取消(回滾)一個(gè)事務(wù),以便消除死鎖,這也是一個(gè)比較耗時(shí)的過程。

哈希表可以看作是個(gè)圖表(見上文圖),圖中出現(xiàn)循環(huán)就說明有死鎖。由于檢查循環(huán)是昂貴的(所有鎖組成的圖表是很龐大的),經(jīng)常會通過簡單的途徑解決:使用超時(shí)設(shè)定。如果一個(gè)鎖在超時(shí)時(shí)間內(nèi)沒有加上,那事務(wù)就進(jìn)入死鎖狀態(tài)。

事務(wù)開始時(shí)獲取鎖,結(jié)束時(shí)釋放鎖,這是可以實(shí)現(xiàn)純粹的隔離,但是這種方法會等待所有的鎖,大量的時(shí)間被浪費(fèi)了。

更快的方法是兩段鎖協(xié)議(Two-Phase Locking Protocol,由 DB2 和 SQL Server使用),在這里,事務(wù)分為兩個(gè)階段:

  • 成長階段:事務(wù)可以獲得鎖,但不能釋放鎖。
  • 收縮階段:事務(wù)可以釋放鎖(對于已經(jīng)處理完而且不會再次處理的數(shù)據(jù)),但不能獲得新鎖。

?

這兩條簡單規(guī)則背后的原理是:

  • 釋放不再使用的鎖,來降低其它事務(wù)的等待時(shí)間
  • 防止發(fā)生這類情況:事務(wù)最初獲得的數(shù)據(jù),在事務(wù)開始后被修改,當(dāng)事務(wù)重新讀取該數(shù)據(jù)時(shí)發(fā)生不一致。

這個(gè)規(guī)則可以很好地工作,但有個(gè)例外:如果修改了一條數(shù)據(jù)、釋放了關(guān)聯(lián)的鎖后,事務(wù)被取消(回滾),而另一個(gè)事務(wù)讀到了修改后的值,但最后這個(gè)值卻被回滾。為了避免這個(gè)問題,所有獨(dú)占鎖必須在事務(wù)結(jié)束時(shí)釋放

數(shù)據(jù)版本控制是解決這個(gè)問題的另一個(gè)方法。

版本控制是這樣的:

  • 每個(gè)事務(wù)可以在相同時(shí)刻修改相同的數(shù)據(jù)
  • 每個(gè)事務(wù)有自己的數(shù)據(jù)拷貝(或者叫版本)
  • 如果2個(gè)事務(wù)修改相同的數(shù)據(jù),只接受一個(gè)修改,另一個(gè)將被拒絕,相關(guān)的事務(wù)回滾(或重新運(yùn)行)

這將提高性能,因?yàn)椋?mark hidden color="red">文章來源:http://www.zghlxwxcb.cn/news/detail-420949.html

  • 讀事務(wù)不會阻塞寫事務(wù)
  • 寫事務(wù)不會阻塞讀
  • 沒有『臃腫緩慢』的鎖管理器帶來的額外開銷

一些數(shù)據(jù)庫,比如DB2(直到版本 9.7)和 SQL Server(不含快照隔離)僅使用鎖機(jī)制。其他的像PostgreSQL, MySQL 和 Oracle 使用鎖和鼠標(biāo)版本控制混合機(jī)制。文章來源地址http://www.zghlxwxcb.cn/news/detail-420949.html

到了這里,關(guān)于數(shù)據(jù)庫底層運(yùn)行原理之——事務(wù)管理器的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【cfengDB】自己實(shí)現(xiàn)數(shù)據(jù)庫第0節(jié) ---整體介紹及事務(wù)管理層實(shí)現(xiàn)

    【cfengDB】自己實(shí)現(xiàn)數(shù)據(jù)庫第0節(jié) ---整體介紹及事務(wù)管理層實(shí)現(xiàn)

    LearnProj 本文作為數(shù)工底層的項(xiàng)目CfengDB開始篇章,介紹開發(fā)緣由和實(shí)現(xiàn)思路 cfeng之前對數(shù)據(jù)庫研究不深入,之前只是能夠做到基本的SQL查詢和基本的慢SQL優(yōu)化,之前拿到數(shù)據(jù)庫系統(tǒng)工程師證書還是只在業(yè)務(wù)上對于DB系統(tǒng)使用更深入,但是cfeng基于work的理解,當(dāng)作為一個(gè)優(yōu)秀的產(chǎn)

    2024年02月16日
    瀏覽(31)
  • 4、hive的使用示例詳解-事務(wù)表、視圖、物化視圖、DDL(數(shù)據(jù)庫、表以及分區(qū))管理詳細(xì)操作

    4、hive的使用示例詳解-事務(wù)表、視圖、物化視圖、DDL(數(shù)據(jù)庫、表以及分區(qū))管理詳細(xì)操作

    1、apache-hive-3.1.2簡介及部署(三種部署方式-內(nèi)嵌模式、本地模式和遠(yuǎn)程模式)及驗(yàn)證詳解 2、hive相關(guān)概念詳解–架構(gòu)、讀寫文件機(jī)制、數(shù)據(jù)存儲 3、hive的使用示例詳解-建表、數(shù)據(jù)類型詳解、內(nèi)部外部表、分區(qū)表、分桶表 4、hive的使用示例詳解-事務(wù)表、視圖、物化視圖、DDL

    2024年02月09日
    瀏覽(26)
  • 【數(shù)據(jù)庫】事務(wù)的隔離級別以及實(shí)現(xiàn)原理

    【數(shù)據(jù)庫】事務(wù)的隔離級別以及實(shí)現(xiàn)原理

    經(jīng)常提到數(shù)據(jù)庫的事務(wù),那你知道數(shù)據(jù)庫還有事務(wù)隔離的說法嗎,事務(wù)隔離還有隔離級別,那什么是事務(wù)隔離,隔離級別又是什么呢?本文就幫大家梳理一下。 事務(wù),由一個(gè)有限的數(shù)據(jù)庫操作序列構(gòu)成,這些操作要么全部執(zhí)行,要么全部不執(zhí)行,是一個(gè)不可分割的工作單位。

    2023年04月26日
    瀏覽(28)
  • Oracle架構(gòu)_數(shù)據(jù)庫底層原理、機(jī)制 (授人以漁)

    Oracle架構(gòu)_數(shù)據(jù)庫底層原理、機(jī)制 (授人以漁)

    目錄 系統(tǒng)全局區(qū)SGA 高速緩存緩沖區(qū)(數(shù)據(jù)庫緩沖區(qū)) 日志緩沖區(qū) 共享池 其他結(jié)構(gòu) 用戶連接進(jìn)程 用戶進(jìn)程User Process Server Process服務(wù)進(jìn)程 程序全局區(qū)PGA Oracle的connect連接和session會話與User Process緊密相關(guān) 后臺進(jìn)程 數(shù)據(jù)庫寫入進(jìn)程(DBWn) 檢查點(diǎn)(CKPT) 進(jìn)程監(jiān)視進(jìn)程(PMON) 系統(tǒng)監(jiān)視進(jìn)程

    2024年01月20日
    瀏覽(20)
  • 分布式數(shù)據(jù)庫事務(wù)故障恢復(fù)的原理與實(shí)踐

    分布式數(shù)據(jù)庫事務(wù)故障恢復(fù)的原理與實(shí)踐

    關(guān)系數(shù)據(jù)庫中的事務(wù)故障恢復(fù)并不是一個(gè)新問題,自70年代關(guān)系數(shù)據(jù)庫誕生之后就一直伴隨著數(shù)據(jù)庫技術(shù)的發(fā)展,并且在分布式數(shù)據(jù)庫的場景下又遇到了一些新的問題。本文將會就事務(wù)故障恢復(fù)這個(gè)問題,分別講述單機(jī)數(shù)據(jù)庫、分布式數(shù)據(jù)庫中遇到的問題和幾種典型的解決方

    2024年02月03日
    瀏覽(26)
  • 客戶端讀寫HBase數(shù)據(jù)庫的運(yùn)行原理

    客戶端讀寫HBase數(shù)據(jù)庫的運(yùn)行原理

    1.HBase的特點(diǎn) HBase是一個(gè)數(shù)據(jù)庫,與RDMS相比,有以下特點(diǎn): ① 它不支持SQL ② 不支持事務(wù) ③ 沒有表關(guān)系,不支持JOIN ④ 有列族,列族下可以有上百個(gè)列 ⑤ 單元格,即列值,可以存儲多個(gè)版本的值,每個(gè)版本都有對應(yīng)時(shí)間戳 ⑥ 行鍵按照字典序升序排列 ⑦ 元數(shù)據(jù) 和 數(shù)據(jù) 分

    2024年02月10日
    瀏覽(25)
  • 【MySQL數(shù)據(jù)庫原理】在MySQL Workbench界面運(yùn)行SQL代碼——學(xué)生管理系統(tǒng)

    【MySQL數(shù)據(jù)庫原理】在MySQL Workbench界面運(yùn)行SQL代碼——學(xué)生管理系統(tǒng)

    在 MySQL Workbench 8.0 中,你可以使用以下步驟新建內(nèi)容并運(yùn)行 MySQL 語言代碼: 1、打開 MySQL Workbench 并連接到你的 MySQL 數(shù)據(jù)庫服務(wù)器。 2、在左側(cè)的導(dǎo)航欄中,展開你的連接以查看數(shù)據(jù)庫。選擇你要在其中運(yùn)行 SQL 代碼的數(shù)據(jù)庫。 3、在頂部菜單欄中,點(diǎn)擊 “Query”(查詢)選項(xiàng)

    2024年02月03日
    瀏覽(38)
  • 數(shù)據(jù)倉庫與事務(wù)管理

    隨著大數(shù)據(jù)時(shí)代的到來,數(shù)據(jù)倉庫已成為企業(yè)決策和支持業(yè)務(wù)發(fā)展的重要工具。然而,關(guān)于數(shù)據(jù)倉庫是否面向事務(wù)處理,一直存在爭議。本文將圍繞這一話題展開討論,重點(diǎn)闡述數(shù)據(jù)倉庫的特點(diǎn)、優(yōu)缺點(diǎn)以及面向事務(wù)處理的技術(shù)和應(yīng)用。 數(shù)據(jù)倉庫是用于存儲、管理和分析大量

    2024年02月11日
    瀏覽(24)
  • 數(shù)據(jù)庫——事務(wù),事務(wù)隔離級別

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

    什么是事務(wù)? 事務(wù)是邏輯上的一組操作,要么都執(zhí)行,要么都不執(zhí)行。 事務(wù)最經(jīng)典也經(jīng)常被拿出來說例子就是轉(zhuǎn)賬了。假如小明要給小紅轉(zhuǎn)賬1000元,這個(gè)轉(zhuǎn)賬會涉及到兩個(gè)關(guān)鍵操作就是:將小明的余額減少1000元,將小紅的余額增加1000元。萬一在這兩個(gè)操作之間突然出現(xiàn)錯(cuò)誤

    2024年02月11日
    瀏覽(25)
  • 千云物流- 多數(shù)據(jù)源事務(wù)管理

    Spring只是個(gè)容器,因此它并不做任何事務(wù)的具體實(shí)現(xiàn)。他只是提供了事務(wù)管理的接口PlatformTransactionManager,具體內(nèi)容由就由各個(gè)事務(wù)管理器來實(shí)現(xiàn)。 DataSourceTransactionManager:位于org.springframework.jdbc.datasource包中,數(shù)據(jù)源事務(wù)管理器,提供對單個(gè)javax.sql.DataSource事務(wù)管理,用于S

    2024年02月02日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包