acid php5,ACID原则
【原子性】
整個事務(wù)中的所有操作,要么全部完成,要么全部不完成,不可能停滯在中間某個環(huán)節(jié)。事務(wù)在執(zhí)行過程中發(fā)生錯誤,會被回滾(Rollback)到事務(wù)開始前的狀態(tài),就像這個事務(wù)從來沒有執(zhí)行過一樣。
【一致性】
一個事務(wù)可以封裝狀態(tài)改變(除非它是一個只讀的)。事務(wù)必須始終保持系統(tǒng)處于一致的狀態(tài),不管在任何給定的時間并發(fā)事務(wù)有多少。
也就是說:如果事務(wù)是并發(fā)多個,系統(tǒng)也必須如同串行事務(wù)一樣操作。其主要特征是保護性和不變性(Preserving an Invariant),以轉(zhuǎn)賬案例為例,假設(shè)有五個賬戶,每個賬戶余額是100元,那么五個賬戶總額是500元,如果在這個5個賬戶之間同時發(fā)生多個轉(zhuǎn)賬,無論并發(fā)多少個,比如在A與B賬戶之間轉(zhuǎn)賬5元,在C與D賬戶之間轉(zhuǎn)賬10元,在B與E之間轉(zhuǎn)賬15元,五個賬戶總額也應(yīng)該還是500元,這就是保護性和不變性。
【隔離性】
隔離狀態(tài)執(zhí)行事務(wù),使它們好像是系統(tǒng)在給定時間內(nèi)執(zhí)行的唯一操作。如果有兩個事務(wù),運行在相同的時間內(nèi),執(zhí)行相同的功能,事務(wù)的隔離性將確保每一事務(wù)在系統(tǒng)中認為只有該事務(wù)在使用系統(tǒng)。這種屬性有時稱為串行化,為了防止事務(wù)操作間的混淆,必須串行化或序列化請求,使得在同一時間僅有一個請求用于同一數(shù)據(jù)。
【持久性】
在事務(wù)完成以后,該事務(wù)對數(shù)據(jù)庫所作的更改便持久的保存在數(shù)據(jù)庫之中,并不會被回滾。
由于一項操作通常會包含許多子操作,而這些子操作可能會因為硬件的損壞或其他因素產(chǎn)生問題,要正確實現(xiàn)ACID并不容易。ACID建議數(shù)據(jù)庫將所有需要更新以及修改的資料一次操作完畢,但實際上并不可行。
目前主要有兩種方式實現(xiàn)ACID:第一種是Write ahead logging,也就是日志式的方式(現(xiàn)代數(shù)據(jù)庫均基于這種方式)。第二種是Shadow paging。
相對于WAL(write ahead logging)技術(shù),shadow paging技術(shù)實現(xiàn)起來比較簡單,消除了寫日志記錄的開銷恢復的速度也快(不需要redo和undo)。shadow paging的缺點就是事務(wù)提交時要輸出多個塊,這使得提交的開銷很大,而且以塊為單位,很難應(yīng)用到允許多個事務(wù)并發(fā)執(zhí)行的情況——這是它致命的缺點。
WAL 的中心思想是對數(shù)據(jù)文件 的修改(它們是表和索引的載體)必須是只能發(fā)生在這些修改已經(jīng) 記錄了日志之后 -- 也就是說,在日志記錄沖刷到永久存儲器之后. 如果我們遵循這個過程,那么我們就不需要在每次事務(wù)提交的時候 都把數(shù)據(jù)頁沖刷到磁盤,因為我們知道在出現(xiàn)崩潰的情況下, 我們可以用日志來恢復數(shù)據(jù)庫:任何尚未附加到數(shù)據(jù)頁的記錄 都將先從日志記錄中重做(這叫向前滾動恢復,也叫做 REDO) 然后那些未提交的事務(wù)做的修改將被從數(shù)據(jù)頁中刪除 (這叫向后滾動恢復 - UNDO)。
【總結(jié)】
從事務(wù)的四個特性可以看到關(guān)系型數(shù)據(jù)庫是要求強一致性的,但是這一點在 NoSQL 數(shù)據(jù)庫中是重點弱化的機制。原因是當數(shù)據(jù)庫保存強一致性時,很難保證系統(tǒng)具有橫向擴展和可用性的優(yōu)勢,因此針對分布式數(shù)據(jù)存儲管理只提供了弱一致性的保障,即 BASE 原理。
總結(jié)
以上是生活随笔為你收集整理的acid php5,ACID原则的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。