摘要:確保持久性是數(shù)據(jù)庫系統(tǒng)中稱為恢復(fù)管理部件的軟件部件責(zé)任。中止狀態(tài)事務(wù)回滾并且數(shù)據(jù)庫已恢復(fù)到事務(wù)開始執(zhí)行前的狀態(tài)之后。
事務(wù)是構(gòu)成單一邏輯工作單元的操作集合。即使有故障,數(shù)據(jù)庫系統(tǒng)也必須保證事務(wù)的正確執(zhí)行,即執(zhí)行整個事務(wù)或?qū)儆谠撌聞?wù)的操作一個也不執(zhí)行。
一、事務(wù)概念事務(wù)是訪問并可能更新各種數(shù)據(jù)項的一個程序執(zhí)行單元。事務(wù)由事務(wù)開始(begin transaction)與事務(wù)結(jié)束(end transaction)之間執(zhí)行的全體操作組成。為了保證數(shù)據(jù)完整性,要求數(shù)據(jù)庫維護事務(wù)的以下性質(zhì):
原子性(atomicity):事務(wù)的所有操作在數(shù)據(jù)庫中要么全部正確反映,要么全部不反映。
一致性(consistency):隔離執(zhí)行事務(wù)時(即,在沒有其他事物并發(fā)執(zhí)行的情況下)保持數(shù)據(jù)庫的一致性。
隔離性(isolation):盡管多個事務(wù)可能并發(fā)執(zhí)行,但系統(tǒng)保證,對于任何一對事務(wù)Ti和Tj,在Ti看來,Tj或者在Ti開始之前已經(jīng)完成執(zhí)行,或者在Ti完成之后開始執(zhí)行。這樣,每個事務(wù)都感覺不到系統(tǒng)中有其他事務(wù)在并發(fā)地執(zhí)行。
持久性(durability):一個事務(wù)成功完成之后,它對數(shù)據(jù)庫的改變是永久的,即使系統(tǒng)可能出現(xiàn)故障。
這些特性通常稱為ACID特性。
設(shè)Ti是從賬戶A過戶50美元到賬戶B的事務(wù)。這個事務(wù)可以定義為
Ti:read(A); A-=50; write(A); read(B); B+=50; write(B);1.一致性
一致性要求事務(wù)的執(zhí)行不改變A、B之和。如果沒有一致性要求,金額可能會被事務(wù)憑空創(chuàng)造或者銷毀!如果數(shù)據(jù)庫在事務(wù)執(zhí)行前是一致的,那么事務(wù)執(zhí)行后仍將保持一致性,這是很容易驗證的。確保單個事務(wù)的一致性是編寫該事務(wù)的應(yīng)用程序員的責(zé)任,完整性約束的自動檢查給這項工作帶來了便利。如果系統(tǒng)的狀態(tài)不再反映數(shù)據(jù)庫本應(yīng)描述的現(xiàn)實世界的真實狀態(tài),稱之為不一致狀態(tài)。
2.原子性保證原子性的思路:對于事務(wù)要執(zhí)行寫操作的數(shù)據(jù)項,數(shù)據(jù)庫系統(tǒng)在磁盤上記錄其舊值,如果事務(wù)沒能完成執(zhí)行(如在事務(wù)執(zhí)行過程中出現(xiàn)了故障),數(shù)據(jù)庫系統(tǒng)將恢復(fù)其舊值,使得表面上事務(wù)從未執(zhí)行過。保證事務(wù)的原子性是數(shù)據(jù)庫系統(tǒng)本身的責(zé)任,具體而言是由事務(wù)管理部件保證的
3.持久性持久性保證事務(wù)一旦成功地完成執(zhí)行,該事務(wù)對數(shù)據(jù)庫所做的更新都是永久的,即使事務(wù)執(zhí)行完成之后出現(xiàn)系統(tǒng)故障。現(xiàn)在假設(shè)計算機系統(tǒng)的故障會導(dǎo)致內(nèi)存數(shù)據(jù)丟失,但已經(jīng)寫入磁盤的數(shù)據(jù)卻不會丟失。可以通過確保以下兩條中的任何一條來達到持久性:下面這兩條都是指的在事務(wù)完成之后發(fā)生故障后信息不會丟失的手段。在這里持久性的事務(wù)完成應(yīng)該包含了兩重含義:一是在事務(wù)結(jié)束的時候更新也全部寫入磁盤了,這樣叫做事務(wù)完成。二是事務(wù)結(jié)束的時候并非所有更新都寫入磁盤了,可能是部分也可能都沒有,但 寫入了哪些更新以及還有哪些沒寫入的更新 的信息是被寫入到磁盤上了的,這樣也叫做事務(wù)完成了。
事務(wù)做的更新在事務(wù)結(jié)束前就已經(jīng)寫入磁盤。
有關(guān)事務(wù)已執(zhí)行的更新和已寫到磁盤上的更新信息必須充分,能讓數(shù)據(jù)庫在數(shù)據(jù)庫系統(tǒng)出現(xiàn)故障后重新啟動時重新構(gòu)造更新。
?
確保持久性是數(shù)據(jù)庫系統(tǒng)中稱為恢復(fù)管理部件的軟件部件責(zé)任。事務(wù)管理部件和恢復(fù)管理部件之間關(guān)系密切。
即使每個事務(wù)都能確保一致性和原子性,如果幾個事務(wù)并發(fā)執(zhí)行,它們的操作會以某種人們所不希望的方式交叉執(zhí)行,這也會導(dǎo)致不一致的狀態(tài)。一種避免事務(wù)并發(fā)執(zhí)行而產(chǎn)生的問題的途徑是串行地執(zhí)行事務(wù),但事務(wù)并發(fā)執(zhí)行能顯著地改善性能。因此人們提出了多種允許多個事務(wù)并發(fā)執(zhí)行的解決方法。
例如:以常用的mysql InnoDB存儲引擎為例:加入商品表items表中有一個字段status,status=1表示該商品未被下單,status=2表示該商品已經(jīng)被下單,那么我們對每個商品下單前必須確保此商品的status=1。假設(shè)有一件商品,其id為10000;如果不使用鎖,那么操作方法如下:
//查出商品狀態(tài) select status from items where id=10000; //根據(jù)商品信息生成訂單 insert into orders(id,item_id) values(null,10000); //修改商品狀態(tài)為2 update Items set status=2 where id=10000;
上述場景在高并發(fā)環(huán)境下可能出現(xiàn)問題: 前面已經(jīng)提到只有商品的status=1是才能對它進行下單操作,上面第一步操作中,查詢出來的商品status為1。但是當(dāng)我們執(zhí)行第三步update操作的時候,有可能出現(xiàn)其他人先一步對商品下單把Item的status修改為2了,但是我們并不知道數(shù)據(jù)已經(jīng)被修改了,這樣就可能造成同一個商品被下單2次,使得數(shù)據(jù)不一致。所以說這種方式是不安全的。
事務(wù)的隔離性確保事務(wù)并發(fā)執(zhí)行后的系統(tǒng)狀態(tài)與這些事務(wù)一個接一個地執(zhí)行后的狀態(tài)是等價的。確保隔離性是數(shù)據(jù)庫系統(tǒng)中并發(fā)控制部件來保證的。
中止事務(wù):不能順利完成的事務(wù)。
回滾:為保證原子性,對中止事務(wù)對數(shù)據(jù)庫所做過的所有更改進行撤銷。
已提交事務(wù):成功完成執(zhí)行的事務(wù)。
補償事務(wù):撤銷已提交事務(wù)所造成的影響的唯一方法,這種補償事務(wù)是交給用戶自己來編寫和執(zhí)行的。
活動狀態(tài):初始狀態(tài);事務(wù)執(zhí)行時處于這個狀態(tài)。在活動狀態(tài)中出現(xiàn)邏輯錯誤可能會進入失敗狀態(tài)
部分提交狀態(tài):最后一條語句執(zhí)行后。此時事務(wù)已經(jīng)完成執(zhí)行,但由于實際輸出可能仍臨時駐留在主存中,一個硬件故障可能可能阻止其成功完成,這個時候就會進入失敗狀態(tài)。
失敗狀態(tài):發(fā)現(xiàn)正常的執(zhí)行不能繼續(xù)之后。系統(tǒng)判定事務(wù)的無法正常進行后(由于硬件或邏輯錯誤),事務(wù)進入失敗狀態(tài)。失敗狀態(tài)的事務(wù)必須進行回滾,這樣就進入了中止狀態(tài)。
中止狀態(tài):事務(wù)回滾并且數(shù)據(jù)庫已恢復(fù)到事務(wù)開始執(zhí)行前的狀態(tài)之后。在中止狀態(tài)中,系統(tǒng)有兩種選擇:1.重啟事務(wù):僅當(dāng)引起事務(wù)中止的是硬件錯誤而不是事務(wù)的內(nèi)部邏輯產(chǎn)生的軟件錯誤時。重啟事務(wù)看成是一個新事務(wù)。2.殺死事務(wù):通常是由于事務(wù)的內(nèi)部邏輯錯誤,只有重寫應(yīng)用程序才能改正,或者由于輸入錯誤,或者所需數(shù)據(jù)在數(shù)據(jù)庫中沒有找到。
提交狀態(tài):成功完成之后。
事務(wù)處理系統(tǒng)通常允許多個事務(wù)并發(fā)執(zhí)行。如前所述,允許多個事務(wù)并發(fā)更新數(shù)據(jù)引起許多數(shù)據(jù)一致性的問題。然而有兩條理由促使我們使用允許并發(fā):
提高吞吐量和資源利用率。一個事務(wù)由多個步驟組成,一些步驟涉及IO活動,另一些涉及CPU活動。計算機系統(tǒng)中CPU和磁盤并行運作。因此IO活動可以與CPU處理并行進行。利用CPU與IO系統(tǒng)的并行性,多個事務(wù)可并行執(zhí)行。當(dāng)一個事務(wù)在一個磁盤上進行讀寫時,另一個事務(wù)可以在CPU上運行,同時第三個事務(wù)又可在另一磁盤上進行讀寫。從而吞吐量增加,即給定的時間內(nèi)執(zhí)行的事務(wù)數(shù)增加,相應(yīng)地,處理器與磁盤利用率也提高,換句話說處理器與磁盤空閑的時間較少。
減少等待時間。如果事務(wù)串行執(zhí)行,短事務(wù)可能必須等待它前面的長事務(wù)完成,這可能導(dǎo)致難以預(yù)測的延遲。如果各個事務(wù)是針對數(shù)據(jù)庫的不同部分進行操作,事務(wù)并發(fā)執(zhí)行可能會更好,各個事務(wù)可以共享CPU周期和磁盤存取。并發(fā)執(zhí)行也能減少平均響應(yīng)時間,即一個事務(wù)從開始到完成所需的平均時間。
在數(shù)據(jù)庫中使用并發(fā)執(zhí)行后的動機本質(zhì)上與操作系統(tǒng)中使用多道程序(multiprograming)的動機是一樣的。
四、可串行化 1.串行調(diào)度和并發(fā)調(diào)度事務(wù)的調(diào)度可以分為串行調(diào)度和并發(fā)調(diào)度。
串行調(diào)度就是在執(zhí)行事務(wù)時,是一個事務(wù)一個事務(wù)地執(zhí)行,就是先按順序執(zhí)行完一個事務(wù)的所有指令,再去按順序執(zhí)行完另一個事務(wù)的所有指令。串行調(diào)度的缺點也就是對應(yīng)于前面并發(fā)執(zhí)行的兩個理由。
并發(fā)調(diào)度就是并發(fā)執(zhí)行多個事務(wù)時的調(diào)度,多個事務(wù)的各條指令可以交叉執(zhí)行,一個處理器可能在多個事務(wù)之間進行上下文切換。并發(fā)調(diào)度存在問題是可能會造成數(shù)據(jù)庫的不一致性,比如修改被覆蓋(課件P6)、臟讀、不可重復(fù)讀、幻讀等等。
???????為了事務(wù)的一致性或者說數(shù)據(jù)庫的一致性,其中的一種主要的思想就是并發(fā)調(diào)度執(zhí)行的效果應(yīng)該和沒有并發(fā)調(diào)度執(zhí)行的結(jié)果相同(也可以有其他方法詳見數(shù)據(jù)庫系統(tǒng)概念25章高級事務(wù)處理6.2并發(fā)控制)。這樣的并發(fā)調(diào)度也被叫做可串行化的(并發(fā))調(diào)度或者具有可串行性。這也是隔離性最強的級別的含義。
2.沖突可串行化調(diào)度和視圖可串行化調(diào)度 為了實現(xiàn)這種并發(fā)調(diào)度的可串行化,兩種可以充分保證可串行化的并發(fā)調(diào)度特例被提出了:沖突可串行化調(diào)度和視圖可串行化調(diào)度,即串行化調(diào)度包含沖突可串行化調(diào)度、視圖串行化調(diào)度,其中視圖串行化調(diào)度又包含沖突串行化調(diào)度。這兩種串行化調(diào)度特例 就是保證可串行化調(diào)度的 多種并發(fā)控制機制的基礎(chǔ)。
指令(操作)沖突的定義如下圖所示,同一事務(wù)的指令之間是不能交換順序的因此也看作是沖突的,當(dāng)兩個不同事務(wù)的對同一數(shù)據(jù)項的兩條指令都是read的時候兩者才是不沖突的。來自不同事務(wù)的兩指令,只要其中一條指令是write的那么,就是互為沖突指令。反之,則互為非沖突指令。如果調(diào)度S可以經(jīng)過一系列非沖突指令交換轉(zhuǎn)換成S",我們稱S和S"是沖突等價的。若一個調(diào)度S和一個串行調(diào)度沖突等價,那么則稱調(diào)度S是沖突可串行化的。
數(shù)據(jù)庫中為了并發(fā)調(diào)度后保證一致性的并發(fā)控制部件,可以采取多個并發(fā)機制來實現(xiàn)串行化從而保證一致性,準確地說是某些機制只允許產(chǎn)生沖突可串行化調(diào)度,而另一些則允許產(chǎn)生非沖突可串行化的視圖可串行化調(diào)度。接下來要講到的并發(fā)控制協(xié)議有基于鎖的協(xié)議(兩段封鎖協(xié)議和基于圖的封鎖協(xié)議)、基于時間戳的協(xié)議、基于有效性檢查的協(xié)議
構(gòu)造一個前驅(qū)圖(有向圖)
結(jié)點是每一個事務(wù)Ti。如果Ti的一個操作與Tj的一個操作發(fā)生沖突,且Ti的操作在Tj的操作前執(zhí)行,則繪制一條邊,由Ti指向Tj,?表征Ti要在Tj前執(zhí)行。
測試檢查:?如果此有向圖沒有環(huán),則是沖突可串行化的!
五、事務(wù)隔離性級別 保證可串行化是隔離性的最高級別,可串行性允許程序員在對事務(wù)編寫代碼時忽略與并發(fā)性相關(guān)的問題,是一個有用的概念。如果說沒有隔離性要求的事務(wù)能讓事務(wù)在獨立執(zhí)行時保證數(shù)據(jù)庫的一致性,那么加上有了最高級別的隔離性(即可串行化)的事務(wù)就能保證事務(wù)在并發(fā)執(zhí)行時也能保證數(shù)據(jù)庫的一致性。
但可串行化的缺點在于對于一些應(yīng)用而言,遵守保證可串行性的那些協(xié)議意味著可能就只能允許極小的并發(fā)性了。在這種情況下,我們采用較弱級別的隔離性即不能從數(shù)據(jù)庫系統(tǒng)上來保證完全的一致性了或者說保證了較弱級別的一致性,要想保證完全的一致性則需要程序員在編寫事務(wù)代碼注意了,所以說使用較弱級別一致性給程序員增加了額外負擔(dān)。
隔離性級別可以分為從強到弱可以分為:可串行化、可重復(fù)讀、已提交讀、未提交讀。也對應(yīng)著從強到弱的一致性級別。關(guān)于四種隔離級別鎖實現(xiàn)的原理可參看Innodb中的事務(wù)隔離級別和鎖的關(guān)系
違反可串行化的三種現(xiàn)象,也是可能破壞數(shù)據(jù)庫一致性的三種異常現(xiàn)象避免詞不達意就不翻譯了:定義參照《sql92標準》以及論文《A Critique of ANSI SQL Isolation Levels》,論文中對SQL92中的標準中定義模糊的地方提出了批評并對隔離級別和異常現(xiàn)象做出了更精準的描述。ps:SQL92標準找到了txt版本的,更新的SQL標準基本上都不是免費的了,找了無果之后沒有繼續(xù)再找。想要繼續(xù)了解SQL標準可以先看看談?wù)凷QL標準
臟讀(dirty read):SQL-transaction T1 modifies a row. SQL-transaction T2 then reads that row before T1 performs a COMMIT.If T1 then performs a ROLLBACK, T2 will have read a row that was never committed and that may thus be considered to have never existed.
不可重復(fù)讀(nonrepeatable read):SQL-transaction T1 reads a row. SQL-transaction T2 then modifies or deletes that row and performs a COMMIT. If T1 then attempts to reread the row, it may receive the modified value or discover that the row has been deleted.
幻讀(phantom read):SQL-transaction T1 reads the set of rows N that satisfy some
?
三種其實都是讀取到的數(shù)據(jù)不一致:
臟讀是讀到了根本從未在數(shù)據(jù)庫中存在過得數(shù)據(jù)。
不可重復(fù)讀是一次事務(wù)中前后兩次相同的讀取,第二次的讀取相比第一次,結(jié)果被刪除了或者被更改了。可以看到這種不可重復(fù)讀的情況是不違背讀已提交的,即在保證了臟讀不會發(fā)生而仍然可以發(fā)生不可重復(fù)讀的。
幻讀就是一個事務(wù)中的兩次相同查詢條件的讀取,第二次相比第一次發(fā)現(xiàn)讀取到的結(jié)果集變多了。可以看到在保證了第二種情況不會發(fā)生的情況下,兩次相同查詢條件的查詢,第一次查詢到的那些記錄肯定不會消失(即不可重復(fù)讀中的被修改或刪除造成的,現(xiàn)保證其不會發(fā)生了),但并不能保證記錄集不會增多。如當(dāng)其他事務(wù)在這期間插入了新的滿足查詢條件的記錄,那么第二次查詢的時候就會發(fā)現(xiàn),雖然第一次查詢的結(jié)果時都在的,但也莫名其妙多了一些。也就是說可重復(fù)讀的情況下,幻讀仍然是可能發(fā)生的
???????在論文中給出的更嚴格的隔離級別與異常現(xiàn)象,及其兩者更完整的關(guān)系:詳情參閱論文以及數(shù)據(jù)庫事務(wù)隔離發(fā)展歷史
?
注意上圖中的論文中重新嚴格定義的四種異常現(xiàn)象當(dāng)中的write并非僅是修改,不可重復(fù)讀當(dāng)中的write與SQL92標準中相同是包含修改、刪除,而幻讀當(dāng)中的write則不光包含92標準中的插入還包含刪除、修改。
參考文獻:
再談數(shù)據(jù)庫事務(wù)隔離性
MySQL時間線,MySQL 4.1/5.0/5.1/5.5/5.6/5.7各版本的主要特性和區(qū)別
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/17817.html
摘要:客戶端設(shè)置手動提交,修改事務(wù)隔離級別為,并且開啟事務(wù)一定要在開啟事務(wù)前修改事務(wù)的隔離級別,不然當(dāng)前還是保持著原來的事務(wù)隔離級別,直到當(dāng)前事務(wù)提交。 本質(zhì) 隔離級別定義了數(shù)據(jù)庫系統(tǒng)中一個操作產(chǎn)生的影響什么時候以哪種方式可以對其他并發(fā)操作可見,隔離性是事務(wù)的ACID中的一個重要屬性,核心是對鎖的操作。 鎖 從數(shù)據(jù)庫系統(tǒng)角度 共享鎖(Shared Lock) 讀鎖,保證數(shù)據(jù)只能讀取,不能被修...
摘要:關(guān)于事務(wù)的隔離性數(shù)據(jù)庫提供了多種隔離級別,稍后會介紹到。這種現(xiàn)象也是正常的,是由于事務(wù)的隔離級造成的,但是在在某些特別的情況下也是不允許的。指定業(yè)務(wù)方法絕對不能在事務(wù)范圍內(nèi)執(zhí)行。內(nèi)部事務(wù)的回滾不會對外部事務(wù)造成影響。 總覽:showImg(https://segmentfault.com/img/bV3dRF?w=677&h=676); 事務(wù)的4大特性(ACID) 原子性(Atomic...
摘要:使用需要使用作為事務(wù)管理器。兩個事務(wù)互不影響。這是默認的隔離級別,使用數(shù)據(jù)庫默認的事務(wù)隔離級別下邊的四個與的隔離級別相對應(yīng)這是事務(wù)最低的隔離級別,它充許另外一個事務(wù)可以看到這個事務(wù)未提交的數(shù)據(jù)。這種事務(wù)隔離級別可 Spring事務(wù)整理 工作了幾年了,今天抽時間整理一下spring的事務(wù),說起spring的事務(wù)是面試的時候面試官經(jīng)常提及的問題,接下來結(jié)合網(wǎng)上資料再總結(jié)下spring的事務(wù)...
摘要:事務(wù)隔離級別定義了一個事務(wù)可能受其他并發(fā)事務(wù)影響的程度我們先來看一下并發(fā)事務(wù)帶來的問題,然后再來介紹一下接口中定義了五個表示隔離級別的常量。 Java面試通關(guān)手冊(Java學(xué)習(xí)指南):https://github.com/Snailclimb/Java_Guide 微信閱讀地址鏈接:可能是最漂亮的Spring事務(wù)管理詳解 事務(wù)概念回顧 什么是事務(wù)? 事務(wù)是邏輯上的一組操作,要么都執(zhí)行,...
摘要:中的事務(wù)控制方式編程式事務(wù)管理通過手動編碼控制事務(wù)的邊界,可以實現(xiàn)細粒度的事務(wù)控制,一般用的較少。隔離級別控制并發(fā)訪問下數(shù)據(jù)庫的安全性。內(nèi)部事務(wù)的回滾不會對外部事務(wù)造成影響。可能導(dǎo)致臟幻不可重復(fù)讀允許在并發(fā)事務(wù)已經(jīng)提交后讀取。 1.事務(wù)的概念 事務(wù)是一組操作的執(zhí)行單元,相對于數(shù)據(jù)庫的單條操作而言,事務(wù)管理的是一組SQL指令,如增刪改查等,事務(wù)的特性體現(xiàn)在事務(wù)內(nèi)包含的SQL指令必須全部執(zhí)...
閱讀 3694·2021-11-11 10:58
閱讀 2476·2021-09-22 15:43
閱讀 2868·2019-08-30 15:44
閱讀 2187·2019-08-30 13:08
閱讀 1821·2019-08-29 17:28
閱讀 884·2019-08-29 10:54
閱讀 675·2019-08-26 11:46
閱讀 3507·2019-08-26 11:43