成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

再談數(shù)據(jù)庫(kù)的事務(wù)隔離性

運(yùn)維 數(shù)據(jù)庫(kù)運(yùn)維
近兩年分布式數(shù)據(jù)庫(kù)技術(shù)加速發(fā)展,而由于金融行業(yè)技術(shù)生態(tài)的限制,周?chē)芏嗤瑢W(xué)對(duì)其并沒(méi)有深入的了解,所以進(jìn)行高性能、高可靠系統(tǒng)設(shè)計(jì)時(shí)往往缺少這一利器。Ivan希望以系列文章的方式與大家交流探討,加深我們對(duì)分布式數(shù)據(jù)庫(kù)的認(rèn)識(shí)。

寫(xiě)在前面

近兩年分布式數(shù)據(jù)庫(kù)技術(shù)加速發(fā)展,而由于金融行業(yè)技術(shù)生態(tài)的限制,周?chē)芏嗤瑢W(xué)對(duì)其并沒(méi)有深入的了解,所以進(jìn)行高性能、高可靠系統(tǒng)設(shè)計(jì)時(shí)往往缺少這一利器。Ivan希望以系列文章的方式與大家交流探討,加深我們對(duì)分布式數(shù)據(jù)庫(kù)的認(rèn)識(shí)。

本文是該系列文章的***篇,主要探討事務(wù)管理中的隔離性,厘清相關(guān)概念和關(guān)鍵技術(shù),為后面闡述分布式數(shù)據(jù)庫(kù)的事務(wù)管理做一個(gè)鋪墊,姑且算是一篇前傳吧。

正文

我們首先從定義出發(fā),事務(wù)管理包括原子性、一致性、隔離性和持久性四個(gè)方面,即ACID。所有數(shù)據(jù)庫(kù)專著都會(huì)給出這個(gè)四個(gè)特性的定義,本文我們引用了Jim Gray對(duì)其的定義。

Jim Gray是事務(wù)處理方面的大師,本文中很多內(nèi)容都來(lái)自他的專著和論文。為避免翻譯引入的歧義,這里我們直接引用原文。

Atomicity: Either all the changes from the transaction occur (writes, and messages sent), or none occur.

Consistency: The transaction preserves the integrity of stored information.

Isolation: Concurrently executing transactions see the stored information as if they were running serially (one after another).

Durability: Once a transaction commits, the changes it made (writes and messages sent) survive any system failures.

在上述隔離性(Isolation)的定義中,我們可以發(fā)現(xiàn)其目標(biāo)是使并發(fā)事務(wù)的執(zhí)行效果與串行一致,但在具體技術(shù)實(shí)現(xiàn)上往往需要在并發(fā)能力和串行化效果之間進(jìn)行平衡,很難兩者兼顧。

平衡的結(jié)果就是會(huì)出現(xiàn)違反串行效果的現(xiàn)象即異常現(xiàn)象(Phenomenon)。通常來(lái)說(shuō),隔離級(jí)別的提升伴隨著并發(fā)能力的下降,兩者負(fù)相關(guān)。各種數(shù)據(jù)庫(kù)在談到隔離級(jí)別時(shí)都會(huì)引用ANSI SQL-92標(biāo)準(zhǔn)隔離級(jí)別,我們來(lái)看看它的具體內(nèi)容。

ANSI SQL-92 Isolation Levels

ANSI SQL-92可能是最早提出了基于異常現(xiàn)象來(lái)定義隔離級(jí)別的方法,同時(shí)沒(méi)有將隔離級(jí)別與具體實(shí)現(xiàn)機(jī)制綁定,隔離的實(shí)現(xiàn)可以基于鎖(lock-based)或者無(wú)鎖(lock-free),兼容了后續(xù)的技術(shù)發(fā)展。該標(biāo)準(zhǔn)根據(jù)三種異常現(xiàn)象將隔離性定義為四個(gè)級(jí)別,具體如下。

 

臟讀,事務(wù)(T1)中修改的數(shù)據(jù)項(xiàng)在尚未提交的情況下被其他事務(wù)(T2)讀取到,而T1進(jìn)行Rollback操作,則T2剛剛讀取到的數(shù)據(jù)并沒(méi)有實(shí)際存在。

不可重復(fù)讀,T1讀取數(shù)據(jù)項(xiàng),T2對(duì)其中的數(shù)據(jù)進(jìn)行了修改或刪除且Commit成功。如果T1嘗試再次讀取這些數(shù)據(jù),會(huì)得到T2修改后的數(shù)據(jù)或者發(fā)現(xiàn)數(shù)據(jù)已刪除。這樣T1在一個(gè)事務(wù)中兩次同樣條件的讀取,且結(jié)果集內(nèi)容變更或結(jié)果集數(shù)量減少。

幻讀,T1使用特定的查詢條件獲得一個(gè)結(jié)果集,T2插入新的數(shù)據(jù)且這些數(shù)據(jù)符合T2剛剛操作的查詢條件。T2 commit 成功后,T1再次執(zhí)行同樣的查詢,此時(shí)得到的結(jié)果集增大。

很多文章都結(jié)合數(shù)據(jù)庫(kù)產(chǎn)品對(duì)上述異常現(xiàn)象的實(shí)例和處理機(jī)制進(jìn)行了說(shuō)明,本文中不再贅述,有興趣的同學(xué)可以參考文末的鏈接[1]。

ANSI SQL-92標(biāo)準(zhǔn)早在1992年發(fā)布,但無(wú)論是當(dāng)時(shí)還是后來(lái)都沒(méi)有被各大數(shù)據(jù)庫(kù)廠商嚴(yán)格遵循,部分原因可能是標(biāo)準(zhǔn)過(guò)于簡(jiǎn)化與實(shí)際應(yīng)用有一定程度的脫離。Jim Gray等人在1995發(fā)布了論文“A Critique of ANSI SQL Isolation Levels” (本文中簡(jiǎn)稱為Critique[2]),對(duì)隔離級(jí)別進(jìn)行更全面的闡述,可以幫助我們加深理解。

Critique Isolation Levels

Critique提出了ANSI SQL-92存在的兩個(gè)問(wèn)題,首先是自然語(yǔ)言方式界定的異常現(xiàn)象并不嚴(yán)格導(dǎo)致一些同質(zhì)化的異常現(xiàn)象被遺漏;其次是一些典型的異常現(xiàn)象并沒(méi)有被涵蓋進(jìn)去,導(dǎo)致隔離級(jí)別存在明顯缺失。

因此,文中對(duì)ANSI SQL-92的三種異常現(xiàn)象(將其編號(hào)為A1/A2/A3)進(jìn)行了擴(kuò)展(編號(hào)為P1/P2/P3),并增加了另外5種常見(jiàn)的異常現(xiàn)象。受限于篇幅,這里僅對(duì)兩種異常現(xiàn)象進(jìn)行說(shuō)明。

Lost Update

丟失更新(Lost Update)是一個(gè)經(jīng)典的數(shù)據(jù)庫(kù)問(wèn)題,由于太過(guò)重要所有主流數(shù)據(jù)庫(kù)都解決了該問(wèn)題,我們這里將操作稍加變形來(lái)舉例。

我們使用MySQL進(jìn)行演示,創(chuàng)建表并初始化數(shù)據(jù): 

  1. create table account (balance int,name varchar(20)) ENGINE=InnoDB;  
  2. insert into account values(50,'Tom'); 

T1

T2

begin;

begin;

select balance into @bal from account where name='Tom'
--------------------
@bal = 50

 

 

select balance into @bal from account where name='Tom'
-------------------
@bal = 50

 

update account set balance = @bal -40 where name = ‘Tom’;

 

commit;

update account set balance = @bal - 1 where name = ‘Tom’;

 

commit;

 

在上述操作中T1、T2串行執(zhí)行效果是對(duì)余額進(jìn)行兩次扣減,分別為40和1,最終值為9,但并行的最終值為49,T2的修改被丟失。我們可以發(fā)現(xiàn)Lost update的實(shí)質(zhì)是T1事務(wù)讀取數(shù)據(jù),而后該數(shù)據(jù)被T2事務(wù)修改并提交,T1基于已經(jīng)過(guò)期的數(shù)據(jù)進(jìn)行了再次修改,造成T2的修改被覆蓋。

Read Skew

讀偏序(Read Skew)是RC級(jí)遇到的問(wèn)題。如果數(shù)據(jù)項(xiàng)x與y存在一致性約束,T1先對(duì)讀x,而后T2修改x和y后commit,此時(shí)T1再讀y。T1得到的x與y不滿足原有的一致性約束。

MySQL默認(rèn)隔離級(jí)別為RR,我們需要手工設(shè)置為RC并初始化數(shù)據(jù): 

  1. set session transaction isolation level read committed 
  2. insert into account values(70,'Tom');  
  3. insert into account values(30,'Kevin'); 

T1

T2

begin;

begin;

select * from account where name=’Tom’;
---------------------
balance name
70 Tom

 

 

select * from account where name=’Tom’;
---------------------
balance name
70 Tom

 

update account set balance = balance - 30 where name='Tom';

 

update account set balance = balance + 30 where name=’Kevin’;

 

commit;

select * from account where name='Kevin';
---------------------
balance name
60 Kevin

 

commit;

 

初始數(shù)據(jù)Tom與Kevin的賬戶合計(jì)為100,在T1事務(wù)內(nèi)的兩次讀取得到賬戶合計(jì)為130,顯然不符合之前的一致性約束。

補(bǔ)充這些異常現(xiàn)象后,Critique給出了新的矩陣,相比ANSI更加完善也更貼合真實(shí)的數(shù)據(jù)庫(kù)產(chǎn)品。 

主流數(shù)據(jù)庫(kù)考慮到串行化效果與并發(fā)性能的平衡,一般默認(rèn)隔離級(jí)別介于RC與RR之間,部分提供了Serializable。特別提醒,無(wú)論ASNI SQL-92還是Critique的隔離級(jí)別都不能確保直接映射到實(shí)際數(shù)據(jù)庫(kù)的同名隔離級(jí)別。

SI&MVCC

快照隔離(SI,Snapshot Isolation)是討論隔離性時(shí)常見(jiàn)的術(shù)語(yǔ),可以做兩種的解讀,一是具體的隔離級(jí)別,SQL Server、CockroachDB都直接定義了這個(gè)隔離級(jí)別;二是一種隔離機(jī)制用于實(shí)現(xiàn)相應(yīng)的隔離級(jí)別,在Oracle、MySQL InnoDB、PostgreSQL等主流數(shù)據(jù)庫(kù)中普遍使用。

多版本并發(fā)控制(MVCC,multiversion concurrency control)是通過(guò)記錄數(shù)據(jù)項(xiàng)歷史版本的方式提升系統(tǒng)應(yīng)對(duì)多事務(wù)訪問(wèn)的并發(fā)處理能力,例如避免單值(Single-Valued)存儲(chǔ)情況下寫(xiě)操作對(duì)讀操作的鎖排斥。MVCC和鎖都是SI的重要實(shí)現(xiàn)手段,當(dāng)然也存在無(wú)鎖的SI實(shí)現(xiàn)。以下是Critique描述的SI運(yùn)作過(guò)程。

事務(wù)(記為T(mén)1)開(kāi)始的瞬間會(huì)獲取一個(gè)時(shí)間戳Start Timestamp(記為ST),而數(shù)據(jù)庫(kù)內(nèi)的所有數(shù)據(jù)項(xiàng)的每個(gè)歷史版本都記錄著對(duì)應(yīng)的時(shí)間戳Commit Timestamp(記為CT)。T1讀取的快照由所有數(shù)據(jù)項(xiàng)版本中那些CT小于ST且最近的歷史版本構(gòu)成,由于這些數(shù)據(jù)項(xiàng)內(nèi)容只是歷史版本不會(huì)再次被寫(xiě)操作鎖定,所以不會(huì)發(fā)生讀寫(xiě)沖突,快照內(nèi)的讀操作永遠(yuǎn)不會(huì)被阻塞。其他事務(wù)在ST之后的修改,T1不可見(jiàn)。當(dāng)T1 commit的瞬間會(huì)獲得一個(gè)CT,并保證大于此刻數(shù)據(jù)庫(kù)中已存在的任意時(shí)間戳(ST或CT),持久化時(shí)會(huì)將這個(gè)CT作為數(shù)據(jù)項(xiàng)的版本時(shí)間戳。T1的寫(xiě)操作也體現(xiàn)在T1的快照中,可以被T1內(nèi)的讀操作再次讀取。當(dāng)T1 commit后,修改會(huì)對(duì)那些持有ST大于T1 CT的事務(wù)可見(jiàn)。

如果存在其他事務(wù)(T2),其CT在T1的運(yùn)行間隔【ST,CT】之間,與T1對(duì)同樣的數(shù)據(jù)項(xiàng)進(jìn)行寫(xiě)操作,則T1 abort,T2 commit成功,這個(gè)特性被稱為First-committer-wins,可以保證不出現(xiàn)Lost update。事實(shí)上,部分?jǐn)?shù)據(jù)庫(kù)會(huì)將其調(diào)整為First-write-wins,將沖突判斷提前到write操作時(shí),減少?zèng)_突的代價(jià)。

這個(gè)過(guò)程不是某個(gè)數(shù)據(jù)庫(kù)的具體實(shí)現(xiàn),事實(shí)上不同數(shù)據(jù)庫(kù)對(duì)于SI實(shí)現(xiàn)存在很大差別。例如,PostgreSQL會(huì)將歷史版本和當(dāng)前版本一起保存通過(guò)時(shí)間戳區(qū)分,而MySQL和Oracle都在回滾段中保存歷史版本。MySQL的RC與RR級(jí)別均使用了SI,如果當(dāng)前事務(wù)(T1)讀操作的數(shù)據(jù)被其他事務(wù)的寫(xiě)操作加鎖,T1轉(zhuǎn)向回滾段讀取快照數(shù)據(jù),避免讀操作被阻塞。但是RC的快照定義與以上描述不同,也包括了T1執(zhí)行過(guò)程中其他事務(wù)提交的***版本[6]。

此外,我們還有一個(gè)重要發(fā)現(xiàn),時(shí)間戳是生成SI的關(guān)鍵要素。在單機(jī)系統(tǒng)中,唯一時(shí)間戳比較容易實(shí)現(xiàn),而對(duì)于分布式系統(tǒng)在跨節(jié)點(diǎn)、跨數(shù)據(jù)中心甚至跨城市部署的情況下如何建立一個(gè)唯一時(shí)鐘就成為一個(gè)非常復(fù)雜的問(wèn)題,我們暫留下一個(gè)伏筆將在后面的專題文章中進(jìn)行討論。

Serializable VS SSI

SI是如此有效,甚至在TPC-C benchmark測(cè)試中也沒(méi)有出現(xiàn)任何異常現(xiàn)象[5],但事實(shí)上SI不能保證完整的串行化效果。Critique中指出,SI還無(wú)法處理A5B(Write Skew,寫(xiě)偏序),如下圖所示: 

Write Skew

寫(xiě)偏序(Write Skew)也是一致性約束下的異常現(xiàn)象,即兩個(gè)并行事務(wù)都基于自己讀到的數(shù)據(jù)集去覆蓋另一部分?jǐn)?shù)據(jù)集,在串行化情況下兩個(gè)事務(wù)無(wú)論何種先后順序,最終將達(dá)到一致?tīng)顟B(tài),但SI隔離級(jí)別下無(wú)法實(shí)現(xiàn)。下圖的“黑白球”常常被用來(lái)說(shuō)明寫(xiě)偏序問(wèn)題。 

如何實(shí)現(xiàn)真正的串行化效果呢?事實(shí)上,早期的數(shù)據(jù)庫(kù)已經(jīng)通過(guò)嚴(yán)格兩階段鎖協(xié)議(S2PL,Strict Two-Phase Locking)實(shí)現(xiàn)了完全的串行化隔離(Serializable Isolation),即正在進(jìn)行讀操作的數(shù)據(jù)阻塞對(duì)應(yīng)寫(xiě)操作,寫(xiě)操作阻塞所有操作(包括讀操作和寫(xiě)操作)。如阻塞造成循環(huán)將構(gòu)成死鎖,則需要進(jìn)行rollback操作。S2PL的問(wèn)題顯而易見(jiàn),在競(jìng)爭(zhēng)激烈場(chǎng)景下,阻塞和死鎖會(huì)造成數(shù)據(jù)庫(kù)吞吐量下降和響應(yīng)時(shí)間的增加,所以這種串行化無(wú)法應(yīng)用于實(shí)際生產(chǎn)環(huán)境。直到SSI的出現(xiàn),人們終于找到具有實(shí)際價(jià)值的串行化隔離方案。

串行化快照隔離(SSI, Serializable Snapshot Isolation,也被翻譯為序列化快照)是基于SI改進(jìn)達(dá)到Serializable級(jí)別的隔離性。SSI由Michael James Cahill在他的論文"Serializable Isolation for Snapshot Databases"[3]中提出(該論文獲得2008 Sigmod Best Paper Award,文章末尾提供了該論文的2009年完整版[4]相關(guān)信息,有興趣的同學(xué)可以深入研究)。

SSI保留了SI的很多優(yōu)點(diǎn),特別是讀不阻塞任何操作,寫(xiě)不會(huì)阻塞讀。事務(wù)依然在快照中運(yùn)行,但增加了對(duì)事務(wù)間讀寫(xiě)沖突的監(jiān)控用于識(shí)別事務(wù)圖(transaction graph)中的危險(xiǎn)結(jié)構(gòu)。當(dāng)一組并發(fā)事務(wù)可能產(chǎn)生異常現(xiàn)象(anomaly),系統(tǒng)將通過(guò)回滾其中某些事務(wù)進(jìn)行干預(yù)以消除anomaly發(fā)生的可能。這個(gè)過(guò)程雖然會(huì)導(dǎo)致某些事務(wù)的錯(cuò)誤回滾(不會(huì)導(dǎo)致anomaly的事務(wù)被誤殺),但可以確保消除anomaly[3]。

從理論模型看,SSI性能接近SI,遠(yuǎn)遠(yuǎn)好于S2PL。2012年,PostgreSQL在9.1版本中實(shí)現(xiàn)了SSI[7],可能也是***支持SSI的商業(yè)數(shù)據(jù)庫(kù),驗(yàn)證了SSI的實(shí)現(xiàn)效果。CockroachDB也從Cahill的論文獲得靈感,實(shí)現(xiàn)SSI并將其作為其默認(rèn)隔離級(jí)別。

隨著技術(shù)的發(fā)展,SI/SSI已經(jīng)成為主流數(shù)據(jù)庫(kù)的隔離技術(shù),尤其是后者的出現(xiàn),無(wú)需開(kāi)發(fā)人員在代碼通過(guò)顯式鎖來(lái)避免異常,從而降低了人為錯(cuò)誤的概率。在分布式數(shù)據(jù)庫(kù)的相關(guān)章節(jié)中,我們將進(jìn)一步對(duì)SSI實(shí)現(xiàn)機(jī)制進(jìn)行深入探討。

作者:

王磊(Ivan),現(xiàn)任職光大銀行領(lǐng)域架構(gòu)師,曾任職于IBM全球咨詢服務(wù)部從事技術(shù)咨詢工作,具有十余年數(shù)據(jù)領(lǐng)域研發(fā)及咨詢經(jīng)驗(yàn)。目前負(fù)責(zé)全行數(shù)據(jù)領(lǐng)域系統(tǒng)的日常架構(gòu)管理、重點(diǎn)系統(tǒng)架構(gòu)設(shè)計(jì)及內(nèi)部研發(fā)等工作。個(gè)人公眾號(hào):金融數(shù)士。 

責(zé)任編輯:龐桂玉 來(lái)源: 博客園
相關(guān)推薦

2023-10-11 08:09:53

事務(wù)隔離級(jí)別

2018-09-06 14:53:39

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

2018-07-17 10:58:45

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

2020-03-05 09:33:15

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

2018-10-17 09:55:06

數(shù)據(jù)庫(kù)隔離級(jí)別MySQL

2021-09-07 10:33:42

MySQL事務(wù)隔離性

2025-02-08 12:05:44

MySQLMyISAMInnoDB

2023-06-01 07:37:48

級(jí)別事務(wù)調(diào)度

2010-10-08 09:38:55

Android數(shù)據(jù)庫(kù)事

2009-09-24 14:12:22

Hibernate數(shù)據(jù)

2025-04-08 06:00:00

2010-04-15 08:57:29

Oracle數(shù)據(jù)庫(kù)

2023-01-31 08:26:01

數(shù)據(jù)庫(kù)方式

2018-01-03 08:52:27

MySQL數(shù)據(jù)庫(kù)級(jí)別

2020-07-15 21:49:01

Rspec數(shù)據(jù)庫(kù)事務(wù)

2024-05-28 00:00:30

Golang數(shù)據(jù)庫(kù)

2020-06-17 16:56:36

數(shù)據(jù)庫(kù)MySQL跨行事務(wù)

2024-04-08 10:11:15

MYSQL數(shù)據(jù)庫(kù)事務(wù)

2010-09-08 15:55:20

SQL事務(wù)特性

2020-03-14 16:37:09

數(shù)據(jù)庫(kù)IT技術(shù)
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 三级黄色片在线播放 | 成人亚洲精品久久久久软件 | 成人在线视频免费观看 | 91久久精品国产91久久 | 精品欧美一区二区三区久久久 | 久久久久久国产精品免费免费男同 | 国产黄色av网站 | 欧美一级黑人aaaaaaa做受 | 精品久久久久香蕉网 | 中文字幕一级毛片 | 国产不卡视频 | 美国一级片在线观看 | 91九色在线观看 | 欧美精品99| 91在线电影 | 国产日韩亚洲欧美 | 国产精品久久性 | 激情福利视频 | 日韩精品在线观看免费 | 日韩精品1区2区3区 成人黄页在线观看 | 亚洲欧美日韩电影 | 国产成人高清 | 天天操天天天 | 午夜精品91 | 极品的亚洲 | 成年无码av片在线 | 国产在线播 | 国产精品99免费视频 | 91九色porny首页最多播放 | av免费在线观看网站 | 午夜成人在线视频 | 久久精品视频网站 | 日韩欧美在线免费观看视频 | 一级黄色片网站 | 久久久久久国模大尺度人体 | 男女羞羞视频在线免费观看 | 国产精品美女久久久久久久网站 | 欧美1区2区| 婷婷综合五月天 | 国产一区二区在线视频 | 伊人久久大香线 |