本節書摘來自異步社群出版社《nosql權威指南》一書中的第1章,第1.3節,作者:【美】joe celko(喬•塞科) ,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
已故的jim gray [2]在20世紀70年代才真正發明了現代事務處理,并在1981年6月寫入經典論文“事務概念:優點和限制”(the transaction concept: virtues and limitations)。從這篇論文開始,有了acid(原子性、一緻性、隔離性和持久性)這個縮寫詞。gray的論文論述了原子性、一緻性、持久性,隔離性是後來補充的。bruce lindsay和他的同僚于1979年在gray的論文的基礎上寫了論文“分布式資料庫要點”(notes on distributed databases),并制定了一緻性的基本原理和資料庫複制的首要标準。1983年,andreas reute和theo härder發表了論文“面向事務的資料庫恢複的原則”(principles of transaction-oriented database recovery),并創造了acid這個名詞。
acid這個術語的具體含義如下。
原子性。事務中的任務(或所有任務)要麼全部執行,要麼全不執行。這是或全或無的原則。如果事務中的一個元素失敗,則整個事務失敗。sql堅守這一原則,insert語句會将整個資料集插入表中,delete語句會從表中删除整個一組行,update語句會删除并插入整個資料集。
一緻性。事務必須在任何時候都滿足系統定義的所有協定和規則。事務不能違反這些協定,同時資料庫在事務開始和結束時必須保持在一緻狀态。在sql中,這意味着在事務結束時所有的限制是true。這可能是由于系統的新狀态是有效的,或者是由于該系統復原到其初始的一緻狀态。
隔離性。事務無法通路處于中間狀态或未完成狀态的任何其他事務的資料。是以,每一個事務自身都是獨立的。在資料庫中,性能和事務的一緻性是必需的。但在sql中不是這樣,隻有隔離級别的概念。會話可以在某些隔離級别看到未送出的資料。這個未送出的資料可以通過會話復原,是以從某種意義上說,這些資料根本不存在。
持久性。一旦事務完成,它将是完整、持續的,并且不能被撤銷。即便是在系統故障、斷電或是其他類型的系統當機的情況下資料也能存活。這是一個硬體問題,但是我們仍然在這方面做了很好的工作。當然,我們隻是不要讓資料在易失性存儲器中存儲,而是盡快将其持久化。
這項功能(特性)在大多數sql資料庫中是通過各種“加鎖”的方案來實作的。“鎖”會決定其他會話如何使用資源,如隻讀取送出的行,或者允許讀未送出的行,等等。這就是所謂的悲觀并發模型(pessimistic concurrency)。其基本假設是,你必須保護自己免受其他人的影響,并且沖突是常态。
另一種流行的并發模型稱為樂觀并發(optimistic concurrency)。如果你了解過數字影片行業,你就能了解這種模式。每個人都會得到資料的一個副本,然後按照他們希望的那樣進行處理。在縮微膠片系統中,影片管理者制作電影文檔(影片)的副本,并把它們分發出去。每位員工将修改他自己的副本,并把它(修改後的影片、文檔)送出到文檔紀錄中心。
這種模型中假設:
查詢比資料庫變更常見得多,專為查詢設計;
資料庫變更過程中沖突極少發生,将其當作例外;
如果确實遇到沖突,相關的會話可以選擇復原,或者可以設定解決的規則。等待情況恢複正常,避免恐慌。
對于縮微膠片系統,大多數請求是讀取資訊,資料從來沒有修改過。對内容進行修改的請求通常在時間上是分離的,是以它們不會産生沖突。當一名或多名員工做了同樣的修改時,并不會産生沖突,修改會直接生效。當兩個員工的修改有沖突時,影片經理會兩個修改都拒絕,然後他等待通過應用規則或是稍後再做的新修改。
樂觀并發取決于每一行的時間戳,保持曆史副本。使用者可以在一個自己知道出局苦處于某個acid狀态的時間點來查詢資料庫。用微縮膠片的比喻來說,就像中央記錄員在等待他人傳回其标記(修改)的副本時的處理方式一樣。但是,這也意味着,我們在“時間=t0”時開始與該資料庫互動,并且如我們所希望的那樣,在“時間=t0, t1, t2,…, tn”時,基于所述時間戳同樣能看到對應的資料。由于“鎖”的作用,插入、删除和更新不會影響查詢。如果要對一個恒定的流入資料進行查詢,如股票和商品交易,樂觀并發非常有用。
關于樂觀并發的更詳細資訊将在關于流式資料庫的5.1.1節中讨論。這種方法是最适于處理不斷變化的資料,但又必須保持資料完整性,并在某個時間點呈現的資料一緻視圖的資料庫。
需要關注的是:資料的集中管理方式并沒有改變!