當前位置:首頁 » 操作系統 » 資料庫事務原理

資料庫事務原理

發布時間: 2022-10-04 03:15:37

㈠ 如何理解資料庫事務一致性

定義:資料庫一致性(Database Consistency)是指事務執行的結果必須是使資料庫從一個一致性狀態變到另一個一致性狀態。

資料庫狀態如何變化?每一次數據變更就會導致資料庫的狀態遷移。如果資料庫的初始狀態是C0,第一次事務T1的提交就會導致系統生成一個SYSTEM CHANGE NUMBER(SCN),這是資料庫狀態從C0轉變成C1。執行第二個事務T2的時候資料庫狀態從T1變成T2,以此類推,執行第Tn次事務的時候資料庫狀態由C(n-1)變成Cn。

定義一致性主要有2個方面,一致讀和一致寫。

一致寫:事務執行的數據變更只能基於上一個一致的狀態,且只能體現在一個狀態中。T(n)的變更結果只能基於C(n-1),C(n-2), ...C(1)狀態,且只能體現在C(n)狀態中。也就是說,一個狀態只能有一個事務變更數據,不允許有2個或者2個以上事務在一個狀態中變更數據。至於具體一致寫基於哪個狀態,需要判斷T(n)事務是否和T(n-1),T(n-2),...T(1)有依賴關系。

一致讀:事務讀取數據只能從一個狀態中讀取,不能從2個或者2個以上狀態讀取。也就是T(n)只能從C(n-1),C(n-2)... C(1)中的一個狀態讀取數據,不能一部分數據讀取自C(n-1),而另一部分數據讀取自C(n-2)。

㈡ 資料庫詳解之事務

究竟什麼是資料庫的事務,為什麼資料庫需要支持事務,為了實現資料庫事務各種資料庫的是如何設計的。還是只談理解,歡迎大家來討論。

1. 資料庫事務是什麼

事務的定義,已經有太多文章寫過,我就不重復了。我理解的事務就是用來保證數據操作符合業務邏輯要求而實現的一系列功能。換句話說,如果資料庫不支持事務,上面業務系統的程序員就需要自己寫代碼保證相關數據處理邏輯的正確性。而資料庫事務就是把一系列保證資料庫處理邏輯正確性的通用功能在資料庫內實現,並且盡量提高效率。

舉個例子,資料庫最開始普及就是在金融業,銀行的存取款場景就是一個最典型的OLTP資料庫場景,而事務就是設計用來保證類似場景的業務邏輯正確性的。

![事務的四個基本特性](https://img-blog.csdnimg.cn/.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAd2luZHRhbGtlcnd5,size_20,color_FFFFFF,t_70,g_se,x_16)

**原子性**,如果你要給家人轉賬,必須在你的賬戶里扣掉100塊,在家人賬戶里加上100塊,這兩筆操作需要一起完成,業務邏輯才是正確的。但是程序在做修改的時,肯定會有先後順序,試想一下程序扣了你的錢,這個時候程序崩潰了,家人賬戶的錢沒有加上。那這100塊是不是消失了?你是不是要發瘋?那麼,就把這兩筆操作放進一個事務里,通過原子性保證,這兩筆操作要麼都成功,要麼都失敗。這樣才能保證業務邏輯的正確性。

**一致性**,有很多文章講過一致性,但是很多人會把一致性跟原子性混在一起說。事務的一致性指的是指每一個事務必須保證執行之後所有庫內的規則依舊成立。比如內外鍵,constraint,觸發器等。舉例來說,你在儲蓄卡里有100元,理財賬戶里有100元,基金賬戶有100元,那麼你在資產總和里會看到300元,這個300元必須是其他三個賬戶余額加在一起得到的。你在給家人轉帳100元是從儲蓄卡里轉出去了100元,那麼在資料庫上可以通過創建觸發器的方式,當儲蓄卡余額賬戶減100元的同時,把資產總和也同步減去100,不然的話,就會出現邏輯上的錯誤,因為你已經轉走了100塊儲蓄卡余額,實際資產總和應該是200,如果還是300,資料庫狀態就不一致了。所以實現事務的時候,必須要保證相關聯的觸發器以及其他所有的內部規則都執行成功,事務才能算執行成功。如果在減去資產總時出錯,那麼這筆轉帳交易也不能成功。因為這樣資料庫就會進入不一致的狀態。

那麼這里跟原子性的區別到底在哪裡呢?原子性是指個多個用戶指令之間必須作為一個整體完成或失敗,而一致性更多是資料庫內的相關數據規則必須同時完成或失敗。

**持久性**,最容易理解的一個,事務只要提交了,那麼對資料庫的修改就會保存下來不會丟了。簡單來說,只要提交了,資料庫就算崩潰了,重啟之後你剛存的100塊依然在你的賬戶里。

**隔離性**,每個事務相對於其他的事務是有一定獨立性的,不能互相影響。因為資料庫需要支持並發的操作來提高效率。在並發操作時,一定要通過操作之間的隔離來保證業務邏輯的正確性。比如,你轉帳100塊給家人,一系列操作的最後一步可能是輸入驗證碼,這個時候轉帳還沒有完成,但是在資料庫里你的賬戶對應的記錄中已經減去100塊,家人賬戶也加了100塊,就等著驗證碼輸入以後,事務提交,完成操作。那麼,這個時候,家人通過手機銀行能夠查到這100塊么?你的答案可能是不能,因為這樣才符合業務邏輯,因為你的轉帳操作還沒有提交,事務還沒有完成。那麼資料庫就應該保證這兩個並發操作之間具有一定的隔離性。

那麼到底應該隔離到什麼程度呢?隔離性又分為4個等級:由低到高依次為Read uncommitted(讀未提交)、Read committed(讀提交)、Repeatable read(可重復讀取)、Serializable(序列化),這四個級別可以逐個解決臟讀、不可重復讀、幻象讀這幾類問題。這些東西是什麼意思?請有興趣的小夥伴自行網路,很多文章都寫的很清楚。

那麼怎麼理解不同的隔離等級呢,首先要理解並發操作,並發操作就是指有不同的用戶同時對一個數據進行讀、寫操作,那麼在這個過程中,每個用戶應該看到什麼數據才能保證業務邏輯的正確性呢? 如果是前面存取款的場景,我必須看到的是已經存進來的錢,也就是必須是已經提交的事務。而12306刷火車票呢,你可以看到有10張余票,但是在下單的時候告訴你票賣完了,因為同時有10個用戶把票買掉了,你需要重新刷余票,這個也是可以接受的,也就是說我可以讀到一些虛假的余票,這樣在業務上也沒有什麼問題。那麼在設計這兩個不同系統時,就可以選擇不同的事務隔離級別來實現不同的並發效果。不同的隔離等級就是要在系統的並發性和數據邏輯的嚴謹性之間做出的平衡。

2. 資料庫如何實現事務

資料庫實現事務會有多種不同的方式,但基本的原理類似,比如都需要對事務進行統一的編號處理,都需要記錄事務的狀態(是成功了還是失敗了),都需要在數據存儲的層面對事務進行支持,以明確哪些數據是被哪些事務、插入、修改和刪除的。同時還會記錄事務日誌等,對事務進行系統化的管理以實現數據的原子性,一致性和持久性。

要實現事務的隔離性,最基礎的就是通過加鎖機制把並發操作適當的串列化來保證數據操作的正確邏輯。但是為了要保證系統具有良好的並發性能,必須要在實現事務隔離性時需要找到合理的平衡點。大部分資料庫(包括Oracle,Mysql,Postgres在內)在做並發控制的時候都會採用MVCC(多版本並發控制)的機制來保證系統具有較高的並發性,不同資料庫實現MVCC的具體方案也不盡相同,但其基本原理類似。

3. MVCC實現原理

所謂MVCC,就是資料庫中的同一查詢根據相關事務執行的先後順序以及隔離級別的不同,可能會存在不同版本的結果,通過這樣的手段來保證大部分查詢操作不會被修改操作阻塞並保證數據邏輯的正確性。也就是資料庫通過保存多個版本的數據( 歷史 數據)來提高系統的並發查詢能力。簡單來說就是用存儲空間來交換並發能力。下面以Postgres為例介紹一下MVCC的一種實現方式幫助大家理解這個重要的資料庫概念。通過下面的圖來解釋Posrgres里最基本的數據可見性是如何實現多版本控制的。

![在這里插入圖片描述](https://img-blog.csdnimg.cn/.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAd2luZHRhbGtlcnd5,size_20,color_FFFFFF,t_70,g_se,x_16)

首先,Postgres里的每一個事務都有編號,這里可以簡單理解為時間順序編號,編號越大的事務發生越晚。然後,資料庫里的每一行記錄都會保存創建這條記錄的事務號(Cre),也會在記錄刪除時保存刪除這條記錄的事務號(Exp),換句話說,只要Exp這里一列里記錄了事務編號,就說明這條記錄被刪除了。那麼一個事務應該能看見那些記錄呢?Postgres里每一個事務都會保存一個當前系統的事務快照(Snapshot),這個快照里會保存事務創建時當前系統的最高(最晚)事務編號,以及目前還在進行中的事務編號。那麼如上圖所示的一個事務的快照里最高事務編號為100,目前正在進行的事務有25,50和75。那麼對應左邊數據記錄,這6行數據的可見性就如同標注的一般:

第一行,Cre 30,沒有刪除,在100這個時間點,應該能看到。

第二行,Cre 50,沒有刪除,但是50這個事務還沒有提交,正在進行中,所以看不見。

第三行,Cre 110,沒有刪除,但是100這個時間點110事務還沒有發生,所以看不見。

第四行,Cre 30,Exp 80,在80的時候數據被刪掉了,所以看不見。

第五行,Cre 30,Exp 75,在30的時候被創建,75時候被刪掉了,但是75這個事務在100的時候還沒有提交,所以這條記錄在100的時候還沒有刪掉,所以看得見。

第六行,Cre30,Exp 110,在30的時被創建,110時候被刪掉,但是在100時候,110還沒有發生,所以看得見。

綜上,就是這個事務對這六條記錄的可見性,也就是一個數據版本。那麼大家可以看一下如果另一個事務的快照里存的是最高事務編號為110,正在進行的事務為50,那麼它能看到的數據應該是哪幾行呢?同時大家也看到,Postgres里刪除一行數據其實就是在這一行的Exp這個列記錄一個刪除事務的編號,相當於做了一個刪除標記,而數據沒有真正被刪除,因此Postgres資料庫需要定期做數據清理操作(Vacuum)。Pstgres的在現實場景里會比這里介紹的要復雜,因為我們這里假定所有的事務最終都是正確提交了,如果存在某些事務沒有提交的情況,那麼可見性就會更加復雜,這里不再展開了。

資料庫事務是基本的資料庫概念,之前已經有很多很好文章做過介紹,這里希望能把自己的理解用比較通俗的描述分享給大家,歡迎來討論交流。

㈢ 資料庫事務原子性,一致性是怎樣實現的

這個問題的有趣之處,不在於問題本身(「原子性、一致性的實現機制是什麼」),而在於回答者的分歧反映出來的另外一個問題:原子性和一致性之間的關系是什麼?

我特別關注了@我練功發自真心
的答案,他正確地指出了,為了保證事務操作的原子性,必須實現基於日誌的REDO/UNDO機制。但這個答案仍然是不完整的,因為原子性並不能夠完全保證一致性。

按照我個人的理解,在事務處理的ACID屬性中,一致性是最基本的屬性,其它的三個屬性都為了保證一致性而存在的。

首先回顧一下一致性的定義。所謂一致性,指的是數據處於一種有意義的狀態,這種狀態是語義上的而不是語法上的。最常見的例子是轉帳。例如從帳戶A轉一筆錢到帳戶B上,如果帳戶A上的錢減少了,而帳戶B上的錢卻沒有增加,那麼我們認為此時數據處於不一致的狀態。


資料庫實現的場景中,一致性可以分為資料庫外部的一致性和資料庫內部的一致性。前者由外部應用的編碼來保證,即某個應用在執行轉帳的資料庫操作時,必須在
同一個事務內部調用對帳戶A和帳戶B的操作。如果在這個層次出現錯誤,這不是資料庫本身能夠解決的,也不屬於我們需要討論的范圍。後者由資料庫來保證,即
在同一個事務內部的一組操作必須全部執行成功(或者全部失敗)。這就是事務處理的原子性。

為了實現原子性,需要通過日誌:將所有對
數據的更新操作都寫入日誌,如果一個事務中的一部分操作已經成功,但以後的操作,由於斷電/系統崩潰/其它的軟硬體錯誤而無法繼續,則通過回溯日誌,將已
經執行成功的操作撤銷,從而達到「全部操作失敗」的目的。最常見的場景是,資料庫系統崩潰後重啟,此時資料庫處於不一致的狀態,必須先執行一個crash
recovery的過程:讀取日誌進行REDO(重演將所有已經執行成功但尚未寫入到磁碟的操作,保證持久性),再對所有到崩潰時尚未成功提交的事務進行
UNDO(撤銷所有執行了一部分但尚未提交的操作,保證原子性)。crash
recovery結束後,資料庫恢復到一致性狀態,可以繼續被使用。

日誌的管理和重演是資料庫實現中最復雜的部分之一。如果涉及到並行處理和分布式系統(日誌的復制和重演是資料庫高可用性的基礎),會比上述場景還要復雜得多。

但是,原子性並不能完全保證一致性。在多個事務並行進行的情況下,即使保證了每一個事務的原子性,仍然可能導致數據不一致的結果。例如,事務1需要將100元轉入帳號A:先讀取帳號A的值,然後在這個值上加上100。但是,在這兩個操作之間,另一個事務2修改了帳號A的值,為它增加了100元。那麼最後的結果應該是A增加了200元。但事實上,
事務1最終完成後,帳號A只增加了100元,因為事務2的修改結果被事務1覆蓋掉了。

為了保證並發情況下的一致性,引入了隔離性,即保證每一個事務能夠看到的數據總是一致的,就好象其它並發事務並不存在一樣。用術語來說,就是多個事務並發執行後的狀態,和它們串列執行後的狀態是等價的。怎樣實現隔離性,已經有很多人回答過了,原則上無非是兩種類型的鎖:


種是悲觀鎖,即當前事務將所有涉及操作的對象加鎖,操作完成後釋放給其它對象使用。為了盡可能提高性能,發明了各種粒度(資料庫級/表級/行級……)/各
種性質(共享鎖/排他鎖/共享意向鎖/排他意向鎖/共享排他意向鎖……)的鎖。為了解決死鎖問題,又發明了兩階段鎖協議/死鎖檢測等一系列的技術。

一種是樂觀鎖,即不同的事務可以同時看到同一對象(一般是數據行)的不同歷史版本。如果有兩個事務同時修改了同一數據行,那麼在較晚的事務提交時進行沖突
檢測。實現也有兩種,一種是通過日誌UNDO的方式來獲取數據行的歷史版本,一種是簡單地在內存中保存同一數據行的多個歷史版本,通過時間戳來區分。

鎖也是資料庫實現中最復雜的部分之一。同樣,如果涉及到分布式系統(分布式鎖和兩階段提交是分布式事務的基礎),會比上述場景還要復雜得多。

@
我練功發自真心
提到,其他回答者說的其實是操作系統對atomic的理解,即並發控制。我不能完全同意這一點。資料庫有自己的並發控制和鎖問題,雖然在原理上和操作系統
中的概念非常類似,但是並不是同一個層次上的東西。資料庫中的鎖,在粒度/類型/實現方式上和操作系統中的鎖都完全不同。操作系統中的鎖,在資料庫實現中
稱為latch(一般譯為閂)。其他回答者回答的其實是「在並行事務處理的情況下怎樣保證數據的一致性」。

最後回到原來的問題(「原子性、一致性的實現機制是什麼」)。我手頭有本Database
System
Concepts(4ed,有點老了),在第15章的開頭簡明地介紹了ACID的概念及其關系。如果你想從概念上了解其實現,把這本書的相關章節讀完應該能大概明白。如果你想從實踐上了解其實現,可以找innodb這樣的開源引擎的源代碼來讀。不過,即使是一個非常粗糙的開源實現(不考慮太復雜的並行處理,不考慮分布式系統,不考慮針對操作系統和硬體的優化之類),要基本搞明白恐怕也不是一兩年的事。

㈣ mysql讀寫分離原理是什麼要如何操作

利用mysql proxy來實現的。

MySQL Proxy最強大的一項功能是實現「讀寫分離(Read/Write Splitting)」。基本的原理是讓主資料庫處理事務性查詢,而從資料庫處理SELECT查詢。資料庫復制被用來把事務性查詢導致的變更同步到集群中的從資料庫。當然,主伺服器也可以提供查詢服務。使用讀寫分離最大的作用無非是環境伺服器壓力。

㈤ spring的事務是用的資料庫的事務嗎

本質上其實是同一個概念,spring的事務是對資料庫的事務的封裝,最後本質的實現還是在資料庫,假如資料庫不支持事務的話,spring的事務是沒有作用的.資料庫的事務說簡單就只有開啟,回滾和關閉,spring對資料庫事務的包裝,原理就是拿一個數據連接,根據spring的事務配置,操作這個數據連接對資料庫進行事務開啟,回滾或關閉操作.但是spring除了實現這些,還配合spring的傳播行為對事務進行了更廣泛的管理.其實這里還有個重要的點,那就是事務中涉及的隔離級別,以及spring如何對資料庫的隔離級別進行封裝.事務與隔離級別放在一起理解會更好些.以上回答希望能幫助到你.

㈥ 在事物結束之前釋放鎖,產生什麼現象這是資料庫原理的相關內容

產生二級封鎖現象,事務T在修改數據R之前必須先對其加X鎖,直到結束才釋放。

資料庫是「按照數據結構來組織、存儲和管理數據的倉庫」。是一個長期存儲在計算機內的、有組織的、可共享的、統一管理的大量數據的集合。

資料庫是以一定方式儲存在一起、能與多個用戶共享、具有盡可能小的冗餘度、與應用程序彼此獨立的數據集合,可視為電子化的文件櫃——存儲電子文件的處所,用戶可以對文件中的數據進行新增、查詢、更新、刪除等操作。

(6)資料庫事務原理擴展閱讀:

資料庫管理系統為管理資料庫而設計的電腦軟體系統,一般具有存儲、截取、安全保障、備份等基礎功能。

資料庫管理系統可以依據它所支持的資料庫模型來作分類,例如關系式、XML;或依據所支持的計算機類型來作分類,例如伺服器群集、行動電話;或依據所用查詢語言來作分類,例如SQL、XQuery;

或依據性能沖量重點來作分類,例如最大規模、最高運行速度;亦或其他的分類方式,不論使用哪種分類方式,一些DBMS能夠跨類別,例如,同時支持多種查詢語言。

㈦ 資料庫的工作原理是什麼

資料庫(Database)是按照數據結構來組織、存儲和管理數據的倉庫,它產生於距今五十年前,隨著信息技術和市場的發展,特別是二十世紀九十年代以後,數據管理不再僅僅是存儲和管理數據,而轉變成用戶所需要的各種數據管理的方式。資料庫有很多種類型,從最簡單的存儲有各種數據的表格到能夠進行海量數據存儲的大型資料庫系統都在各個方面得到了廣泛的應用。

㈧ 資料庫原理:在某個事務加了X鎖過後,是不是還是可以被另一個事務(不加任何鎖)讀取or修改其數據

基本的封鎖類型有兩種:排它鎖(X鎖)和共享鎖(S鎖).所謂X鎖,是事務T對數據A加上X鎖時,只允許事務T讀取和修改數據A,所以某事務對數據加x鎖後,其他事務不能讀取or修改數據。

熱點內容
2021款es升級了哪些配置 發布:2024-03-28 21:26:44 瀏覽:384
下述調度演算法 發布:2024-03-28 21:22:24 瀏覽:616
捷達哪個配置裝有esp 發布:2024-03-28 21:17:41 瀏覽:196
天氣源碼 發布:2024-03-28 21:14:11 瀏覽:428
使命召喚紅魔浪潮如何配置 發布:2024-03-28 21:13:08 瀏覽:546
nginx安裝php 發布:2024-03-28 21:09:47 瀏覽:667
利用python進行數據分析pdf 發布:2024-03-28 20:33:36 瀏覽:560
php模擬post提交 發布:2024-03-28 20:23:14 瀏覽:542
phptxt下載 發布:2024-03-28 20:12:37 瀏覽:476
如何更衣櫃密碼鎖密碼設置 發布:2024-03-28 19:42:09 瀏覽:484