天天看點

TDSQL | 資料異常的本質和價值詳解

資料異常在資料庫領域中較為常見,但目前業界内并沒有關于資料異常的通用定義。騰訊金融雲TDSQL首席架構師李海翔老師攜手團隊對資料異常的本質和價值進行研究,該研究成果目前已經發表在《軟體學報》上,論文題目為《資料庫管理系統中資料異常體系化定義與分類》。該文評審專家認為:

本文系統地研究了資料庫的資料異常及其對應的隔離級别,通過形式化的定義,總結和規範了資料異常的類型。基于形式化的解釋,解釋了不同資料異常之間的本質差別。同時,本文還通過偏序關系對資料異常進行分類,并闡述了資料異常與隔離級别之間的關系。另外,本文深入總結了前人在資料異常領域的研究工作,文獻充實。文章具有極高的學術水準,作者分享了其在事務并發控制中資料異常和隔離級别上的深刻認知,另外作者也提供相應的開源工具用來檢測資料異常,是一篇對事務并發控制方向非常有影響力的論文。

本次分享就是基于該篇論文的主要内容,以下是分享實錄:

資料異常在資料庫中很常見,但資料異常的基本問題,其實并沒有得到很好的解決。比如在整個事務處理領域究竟有多少種資料異常?最開始SQL标準定義了4種資料異常,1995年Jim Gray等人在前者的基礎上又提出了4種新的資料異常。在閱讀了數百篇Paper後,我們也發現從1995年到2017年之間,不斷有人在提出新的資料異常,加起來有将近20種。

近幾年也陸續有人提出新的資料異常,包括2019年TDSQL也在分布式系統下報告了新的異常。比如下圖中提到的讀半已送出資料異常。

在一個分布式系統中,有兩個資料項,跨兩個實體節點,一個在A節點上,一個在B節點上。有一個分布式事務,這個分布式事務是一個轉賬事務,即寫X和Y,要給X減去10元,要給Y加10元。這時該事務是可以正常執行的。但對于另一個隻讀事務來說,當它要跨兩個實體節點去讀資料時,它讀到的是資料舊的狀态,在另一個節點又讀到了新的狀态,一個新狀态和一個舊狀态是在一個事務之前的狀态和之後的狀态,這兩個狀态跨越了一個事務的送出的一緻性點,出現賬戶總額不比對的情況,發生了資料不一緻性現象(一緻的情況是X+Y或者(X-10)+(Y+10),總和一定是X+Y),這就是我們所說的讀半已送出資料異常。

除了上述例子外,還有一些其他的資料異常,例如讀偏序、寫偏序等。我們會發現,傳統的教科書,在提到資料異常的時候,總是一個一個的說髒讀、髒寫、寫偏序等資料異常分别是什麼樣子。這些都是針對每一個具體的資料異常,去加以形式化的描述,并沒有一個關于資料異常的通用定義(即不能從資料異常整體上給出一個清晰定義)。那究竟什麼是資料異常?這麼多的資料異常之間究竟有什麼關系?該如何用一個統一的方式或架構來了解所有的資料異常?這些都是沒有解決的問題。在事務處理領域,連“資料異常究竟有多少個”這樣的基本問題都不知道,不能回答,可見該領域還有很大空間。

為了了解資料異常,我們去探索了資料異常、變量和并發事務之間的關系。在這個問題的驅動下,我們把資料異常、變量、并發事務這些相關因素統一在一個模型下,再對資料異常加以形式化的定義,去找出每類資料異常的特征。這時我們發現資料異常其實有無窮多個。它不隻是SQL标準所定義的4個資料異常,也不隻是1995年Jim Gray等人定義的8種資料異常,其實,資料異常有無窮多個。

在資料異常有無窮多個的情況下,我們要如何去了解資料異常?這就要求必須對資料異常進行分類。我們用環形式化表達資料異常,對資料異常進行了特征研究。因為環的邊的種類是固定的,可以根據邊的種類可以對資料異常進行分類。分好類後,我們又進一步研究了非謂詞類的資料異常,比如髒讀、髒寫、不可重複讀和幻讀這樣的謂詞類資料異常,看它們之間有什麼樣的關系。

在了解了資料異常後,我們又去思考資料異常和一緻性之間的關系。目前的事務處理領域的教科書,對一緻性也沒有一個統一且完整的定義。