1. 程式人生 > >資料庫的事務實現與ACID屬性

資料庫的事務實現與ACID屬性

本文簡要講述了作者所理解的事務概念與ACID屬性,並簡要介紹了這四個屬性在資料庫中的實現方式。
事務,本質來說就是一組由一個人發起的連續的邏輯操作來完成一件事情,在完成整個事情之前,其所有的改動,都不應該對其他人可見和影響。而在事務結束之後,其一切的改動,都必須“全部”、“立刻”對其他的人可見。 原子性:就是指一組操作,要不就都成功,要不就都失敗,不存在中間狀態。 一致性:也就是說,事務在提交或回滾的時候,對其他人來說,資料的狀態是同一的。以轉賬為例,假設ABC三個賬號各有100元,那麼無論怎麼轉,整個系統的總額度始終是300,錢不會生成或消失。 隔離性:是指併發的事務在執行時候的效果要達到看起來像是序列執行的一樣,通常也稱為可序列化排程。隔離性和一致性是緊密相連的。 資料庫中的事務無非讀事務和寫事務,讀事務和讀事務之間不涉及資料修改,可以直接並行。兩個寫事務同時修改一條記錄的時候可以通過行鎖保證序列。複雜的是讀事務和寫事務之間的關係。 讀事務和寫事務之間實現了四種隔離級別,不同隔離級別間的差別在於鎖的粒度(範圍)不同,範圍越大,並行效率越低,反之,並行的效率就越高。這裡常用的鎖,主要可以歸納為以下兩種:1、讀寫鎖     2、排他鎖 讀未提交:其實就是什麼鎖也沒有,此時資料的中間狀態是有可能被其他人讀到的。 讀已提交:由讀寫鎖實現,每次查詢之後都會釋放讀鎖,這樣其他人就可能會更改那些釋放了讀鎖的資料,當前事務再去讀取的時候,就可能讀取到被別人修改過的資料。所以一個人在事務中讀取到的某個資料,可能下次讀取就變成了別的資料,也就是不可重複讀。 可重複讀:也是讀寫鎖實現,但是讀鎖會阻塞其他人的寫。於是,一個事務中讀取到的資料都加了鎖,其他人沒有辦法更改他們,實現了可重複讀。 儘管鎖實現了可序列化排程,但是鎖的效率偏低。為了提高多執行緒併發時的效能指標,人們有設計出了MVCC。所謂MVCC是指每個人在事務中都會先申請一個事務ID,這個ID是自增的,每個事務都有自己的唯一ID,同時全域性維護一個最大已提交的ID。這樣每個寫事務都需要生成一個ID,有的在事務開啟時生成ID,而有的則在事務commit的時候生成ID。每個讀事務開啟時,會原子地讀取事務的ID,如果只讀取小於等於自己事務ID的資料,這樣實現的語義就是可重複讀。而如果讀取小於等於全域性ID的資料,那麼就對應著讀已提交。 最後是序列化,就是所有操作都順序來,通常是一個全域性大鎖鎖住。 永續性:就是指事務執行後,就丟不了。一般是採用WAL的方式,將操作提前記錄到日誌中來保證宕機的情況能夠恢復沒來得及刷到磁碟的操作。