如何理解資料庫事務中的一致性的概念?

時間 2021-05-06 05:25:00

1樓:謝謝

我的理解是事務一致性保證資料在commit之前如果沒有錯誤(既違反約束)那麼在commit之後就不應該再出現錯誤。保證事務提交前後的一致性,既所謂從一種正確的狀態轉換為另一種正確的狀態。

2樓:

看官方文件,這年頭複製來複製去,誤人子弟的太多

3樓:check-777

說下愚見,教課書給出的是從乙個一致性狀態到另乙個一致性狀態。

這個一致性狀態是指資料庫中的資料滿足完整性約束。

OK,下面舉兩個例子

假設有A和B兩個賬戶,A有2000元,B有1000元。

第乙個例子:A向B轉了500元,A的餘額為1500元。假設此時不執行B增加500元這個乙個操作,這就不滿足完整性約束。

這個例子的完整性約束就是A和B的總餘額不變。前乙個一致性狀態保持了,但是事務執行後,另乙個一致性狀態沒有保持,也就是沒有符合這個約束。

第二個例子:A向B轉了2500元,此時A的餘額小於0,變為負數。此時事務因為不滿足餘額大於0這個約束,就會發生回滾。

因為第二個例子不滿足A的餘額要大於0這個約束,也就是進入了另乙個不一致狀態。

總結一下,只要不滿足資料的完整性約束,就是不一致狀態。但是完整性約束是包括使用者自定義約束的,所以所謂的一致性狀態是面向使用者來說的,什麼是對什麼是錯都是使用者來定義的。

4樓:7987

什麼是一致性:資料庫始終都是描述的真實的現實世界,具體來說就是滿足業務上的一些一致性需求,譬如,銀行系統內部轉賬轉來轉去,金額總和是不變的,也沒有負數餘額的賬戶等等

事務的一致性C是基於A,I,D的,即不考慮事務的併發(I)和資料庫的可靠性(D),事務操作都是原子的情況下(A),如何實現資料的一致性:

完整性約束:可以通過SQL構建,比如not null, 主鍵約束,參照約束,check約束等,這類約束特點是:資料表設計者建立——資料庫自動檢查——比較簡單,不構成效能問題,但是無法勝任複雜的約束程式的一致性約束:

取決於業務的需求,即事務中間進行的多個操作的要保證業務上的一致性約束需求。譬如:簡單的打款,你可以通過建表時設定賬戶餘額字段不能為負數來使得餘額不足時無法打款,這是完整性約束;但是,你也可以不設定賬戶不允許負數的規則,而是在事務執行過程裡自己做判斷來實現這一一致性約束。

如果是比打款更加複雜的一致性(取決於業務),顯然業務有各種各樣的一致性約束需求,如果都通過資料庫定義來實現,一是過於複雜的約束檢查在效能上可能會有問題,二來也使得資料庫設計有些臃腫:業務耦合太多,因此,這部分的一致性需要應用程式設計者自己來實現,即事務裡具體執行的操作。

結論:事務裡的一致性,由資料庫自動檢查和程式設計師兩方面來保障

5樓:

一頓操作猛如虎,一看戰績0比5...

最近剛好想要問這個問題,你們總是雲山霧罩,玄之又玄...還好在書本上找到了答案

簡單理解什麼是事務的一致性,先要從資料庫的一致性談起。

這樣,由於故障,系統的狀態不在反映資料庫本應描述的現實世界的真實狀態。我們把這種狀態稱為不一致狀態。(來自《資料庫系統概念》第十二章,外國那本)

資料庫的一致性就是資料庫中的資料狀態與其需要描述的現實世界的資料狀態保持一致,否則就是不一致。

而事務的一致性就是說要保證資料庫在事務執行前後的資料狀態與現實世界業務邏輯發生的前後狀態保持一致。

用AB兩個使用者轉賬問題舉例很容易產生疑惑,資料庫的資料狀態明明發生了變化,怎麼還叫做一致性呢?比如有人說AB兩個賬戶總額沒有發生變化,這叫一致性...我很想問問,有人去取錢怎麼辦?

網上還有說約束完整性,但還是感覺不全面不恰當...只有理解了資料庫的一致性狀態才使我雲清霧明

在這裡,一致性要求事務的執行不改變A、B之和。(還是那本書,那個用爛的例子)

這樣是不是理解的就透徹多了呢?

事務的一致性是指在事務的執行前後保持資料庫的一致性。(而這個資料庫的一致性是指資料庫的資料狀態與其需要描述的現實世界的資料狀態保持一致。)

從這個角度講,事務的原子性和一致性自然是一體兩面的關係。原子性是面向底層的資料庫系統,要麼全部執行,要麼全部不執行;而一致性是面向應用層的業務邏輯的,要保持資料庫資料狀態變化與需要描述的現實世界的資料狀態變化保持一致。

6樓:二階邏輯

原子性:事務的所有動作要麼全部執行,要麼由於出錯而撤銷事務的部分影響,這一點非常重要,這個特性叫做原子性

永續性:一旦事務執行成功,其影響必須儲存在資料庫中——乙個系統故障不應該導致資料庫忽略成功完成的事務,這個特性叫做永續性

隔離性:在乙個有多個事務併發執行的資料庫系統中,如果對共享資料的更新不加以控制,事務就可能看到由別的事務的更新引起的中間狀態的不一致,這種情況會導致對資料庫中儲存的資料的錯誤更新。所以資料庫系統必須提供隔離機制以保證事務不受其他併發執行的事務影響,這個特性叫做隔離性

以上內容在《資料庫系統概念》一書第四部分事務管理的開篇語中,文中沒有提到一致性,為什麼沒有「一致性」,可以參考本提問中 @孟波 的回答。

7樓:

教科書上會說,一致性是保證資料庫中的約束不會被打破,比如外碼約束,又比如轉賬業務中金額總和不變。

這裡的一致性更多的在表達一種正確性的意思,包括資料庫的正確性和應用程式的正確性。

如果進行一下考古,可以看出這裡的一致性就是拿來趕時髦,湊數的。

8樓:吳垚

按照ACID來說,如果憑感覺的話資料庫的一致性貌似說的是Isolation隔離性,但如果按照翻譯來說,一致性是Consistency。

所以,首先要區別一致性問的是Isolation的特點,如髒讀幻讀等,還是問的Consistency的關係約束的特點。這是很容易弄混的。叫什麼名字不重要,重要的是清楚問題是什麼。

按照維基百科的解釋:

In 1983,[1] Andreas Reuter and Theo Hrder coined the acronym ACID as shorthand for Atomicity, Consistency, Isolation, and Durability, building on earlier work[2] by Jim Gray who enumerated Atomicity, Consistency, and Durability but left out Isolation when characterizing the transaction concept. These four properties describe the major guarantees of the transaction paradigm, which has influenced many aspects of development in database systems.

Jim Gray當時沒有抽象出Isolation,是後人在他的基礎上加的。有時候感覺ACD和I談的內容不是在乙個層面上,ACD是巨集觀上的目標,I是具體的實現。也不知道Jim Gray後來怎麼看ACID的稱呼。

再來看,Isolation說的是併發事務的隔離性,事務讀寫互不影響,個人認為是Atomicity原子性的另乙個表述層面。Consistency指的是完整性約束的一致性,如果用Constraint來表示更容易區分開。

問題在於,如果違反了Isolation的隔離性,併發事務讀寫出了問題,導致讀到或者寫入的資料有問題,常常被理解為「讀寫不一致」,被誤以為是資料庫的一致性問題。

有時候我們常被概念的名字迷惑,這時需要透過現象看本質。

9樓:Optimizer

看到這個問題不得不感慨一致性這個詞的濫用,大部分回答將CAP中的一致性和資料庫的一致性搞混了,資料庫的一致性準確定義是:

Consistency ensures that a transaction can only bring the database from one valid state to another, maintaining database invariants: any data written to the database must be valid according to all defined rules, including constraints,cascades,triggers, and any combination thereof.

摘自ACID (computer science)

這裡說到的資料庫的不一致,主要指的是不符合資料庫定義的規則,包括constraints,cascades,triggers, and any combination thereof. 舉個簡單的例子,你在乙個事務中無法將整型賦值給字串型別的字段, 就這麼簡單。

個人認為CAP中的一致性應該跟ACID中的A和I關係比較大, 和資料庫的一致性是截然不同的東西

10樓:就是弟弟

Atomic: 客戶是上帝,上帝只在意結果,不喜歡繁瑣,所以暴露給客戶的介面足夠簡潔,只有成功和失敗

Consistency:我的每個狀態轉換都是合法的Isolation:我不影響其他人,其他人也不要影響我Durability:

我說過的話絕不(能)反悔其中I和C主要是自我要求,AD主要是對外保證。有了這四點,就提供了乙個完備的事務抽象

11樓:Learner

consistency實在太多了: replica consistancy;cap中的c即linearizability;還有acid中的c,,,英語詞彙這麼少嗎,幹嘛瞅準了consistency往死了用,可坑死我等碼農了

acid中的aid是資料庫的屬性,而c是使用資料庫的應用程式的屬性,即依賴應用程式定義的invariants,保證c,保證應用程式狀態的正確

怎麼簡單地理解資料庫的概念?

舉個資料庫的例子 姓名性別年齡 張三男 21歲 李四男 20歲 王五男 19歲 以上是乙個資料庫的內容。這些資訊可以採用某種檔案形式儲存在計算機磁碟上,如儲存為文字檔案 d names.txt。可以認為是資料庫以檔案的形式儲存在磁碟。之後可以通過命令進行檢索 修改 統計。資料庫檔案和最後的那些操作命...

網路遊戲如何保證資料一致性?

王sir說大資料 這種大型遊戲用的肯定是集群型別的資料庫,並且為了遊戲體驗性肯定有記憶體級別的快取集群,或者直接用記憶體級別的集群,比如redis。 libla 我的答案是,要麼加乙個資料快取單點 可以是redis,但實測redis效能頂不住,可以考慮專用快取伺服器 專用rpc 要麼把具體業務收縮到...

如何理解羽毛球運動中所謂的「一致性」

拾味 說得通俗明白點,就是你的後場球前場球的動作都是一樣的。比如在後場,你一架拍,無論是打高遠球殺球還是吊球,你的動作都是一樣的。在前長,勾搓放推,也是一樣的動作,同樣的動作卻可以打出不一樣的球。這大概就是動作的一致性。 不夠徹底的豬 試想一下如果你還沒有出手,對方就知道你要打什麼球,這種比賽怎麼?...