事務的四大特性和隔離級別

2022-09-23 21:30:25 字數 3028 閱讀 2783

1.事務的四大特性(acid):指資料庫事務正確執行的四個基本要素的縮寫。包含:原子性(atomicity)、一致性(consistency)、隔離性(isolation)、永續性(durability)。乙個支援事務(transaction)的資料庫,必需要具有這四種特性,否則在事務過程(transaction processing)當中無法保證資料的正確性,交易過程極可能達不到交易方的要求。

第乙個原子性,這個是最簡單的。說的是乙個事物內所有操作共同組成乙個原子包,要麼全部成功,要麼全部失敗。這是最基本的特性,保證了因為一些其他因素導致資料庫異常,或者宕機。

第二一致性,這個是大家誤解最深的,很多部落格都喜歡用銀行轉賬的例子來講一直性,所謂的一致性是基於原子性。

原子性只保證了乙個事物內的所有操作同一性,大家同生死,不會出現你死了,我還活著。但是,原子性並沒***大家同一時刻一起生,一起死。計算機指令是有先後順序的,這樣就決定了乙個事物的提交,會經歷乙個時間過程,那麼如果事物提交進行到了一半,我讀取了資料庫,會不會讀到中間結果?

為了防止這樣的情況,資料庫事物的一致性就規定了事物提交前後,永遠只可能存在事物提交前的狀態和事物提交後的狀態,從乙個一致性的狀態到另乙個一致性狀態,而不可能出現中間的過程態。也就是說事物的執行結果是量子化狀態,而不是線性狀態。

資料庫提交事物會有乙個過程,如果提交的時候,存在乙個時間差,在提交的第一秒,乙個刪除過程還沒完成到了第三秒才完成,會不會第一秒訪問的人和第三秒訪問的人得到不同的結果?出現不一致,狀態的混沌?這就是一致性得保證的只會有前狀態和後狀態,絕不會出現中間態。

事物的隔離性,基於原子性和一致性,因為事物是原子化,量子化的,所以,事物可以有多個原子包的形式併發執行,但是,每個事物互不干擾。

但是,由於多個事物可能操作同乙個資源,不同的事物為了保證隔離性,會有很多鎖方案,當然這是資料庫的實現,他們怎麼實現的,我們不必深究。

永續性,當乙個事物提交之後,資料庫狀態永遠的發生了改變,這個事物只要提交了,哪怕提交後宕機,他也確確實實的提交了,不會出現因為

剛剛宕機了而讓提交不生效,是要事物提交,他就像洗不掉的紋身,永遠的固化了,除非你毀了硬碟。

2.不考慮隔離性可能產生的問題

現在重點說明下事務的隔離性,當多個執行緒(或多個客戶端)都開啟事務運算元據庫中的資料時,資料庫系統要能進行隔離操作,以保證各個執行緒獲取資料的準確性。

如果不考慮事務的隔離性,會發生的幾種問題:

2.1 髒讀

髒讀是指在乙個事務處理過程中讀取了另乙個未提交的事務中的資料。

2.2 不可重複讀

不可重複讀是指對於資料庫中的某個資料,乙個事務內多次查詢卻返回了不同的資料值,這是由於在事務執行過程中,資料被另乙個事務修改並提交了。

2.3 幻讀

幻讀是事務非獨立執行時發生的一種現象。例如,事務t1對乙個表中所有的行的某個欄位做了從「1」修改為「2」的操作,這時事務t2又插入了一條新的記錄,而該字段的值為「1」並且提交給資料庫。這時,操作事務t1的使用者如果再檢視剛剛修改的資料,會發現還有一行沒有修改,其實這行是從事務t2中新增的,就好像產生幻覺一樣,這就是產生了幻讀。

幻讀和不可重複讀都是讀取了另一條已經提交的事務,所不同的是不可重複讀查詢的都是同乙個資料項,而幻讀針對的是一批資料(比如資料的個數)。

3.事務的隔離級別

3.1 read uncommitted: 讀取尚未提交的資料 :哪個問題都不能解決

3.2 read committed:讀取已經提交的資料 :可以解決髒讀 ---- oracle、sql server、postgresql 預設的

3.3 repeatable read:重讀讀取:可以解決髒讀 和 不可重複讀 ---mysql預設的

3.4 serializable:序列化:可以解決 髒讀 不可重複讀 和 虛讀---相當於鎖表

以上四種隔離級別最高的是serializable,最低的是read uncommitted級別。當然,隔離級別越高,執行效率就越低。

01:mysql的預設隔離級別是:可重複讀:repeatable read;

02:oracle資料庫中,只支援seralizable(序列化)級別和read committed();預設的是read committed級別;

下面就四種隔離級別進行場景設計:

01: read uncommitted 讀未提交; 公司發工資了,領導把5000元打到singo的賬號上,但是該事務並未提交,而singo正好去檢視賬戶,發現工資已經到賬,是5000元整,非常高興。可是不幸的是,領導發現發給singo的工資金額不對,是2000元,於是迅速回滾了事務,修改金額後,將事務提交,最後singo實際的工資只有2000元,singo空歡喜一場。

02:read committed 讀已提交; singo拿著工資卡去消費,系統讀取到卡里確實有2000元,而此時她的老婆也正好在網上轉賬,把singo工資卡的2000元轉到另一賬戶,並在singo之前提交了事務,當singo扣款時,系統檢查到singo的工資卡已經沒有錢,扣款失敗,singo十分納悶,明明卡里有錢,為何......

03:repeatable read 重複讀 當singo拿著工資卡去消費時,一旦系統開始讀取工資卡資訊(即事務開始),singo的老婆就不可能對該記錄進行修改,也就是singo的老婆不能在此時轉賬。

04:重複讀可能出現幻讀: singo的老婆工作在銀行部門,她時常通過銀行內部系統檢視singo的信用卡消費記錄。有一天,她正在查詢到singo當月信用卡的總消費金額(select sum(amount) from transaction where month = 本月)為80元,而singo此時正好在外面胡吃海塞後在收銀台買單,消費1000元,即新增了一條1000元的消費記錄(insert transaction ... ),並提交了事務,隨後singo的老婆將singo當月信用卡消費的明細列印到a4紙上,卻發現消費總額為1080元,singo的老婆很詫異,以為出現了幻覺,幻讀就這樣產生了。

serializabale:最高的事務隔離級別,代價花費最高,效能很低,很少使用,在此級別下,事務順序執行,避免上述產生的情況。

事務的四大特性和隔離級別

事務,其定義是應用程式中一系列不可分割的操作,就是一組可以完成某個業務的 集合,在關聯式資料庫中,事務可以是一條sql語句,或者一組sql語句,亦或整個程式。其中事務有四個特徵,必須同時滿足這四個特徵才是乙個完整的事務。即事務的acid特性 原子性 atomicity 即事務是資料庫的不可分割單元,...

事務的四大特性和隔離級別

在資料庫操作中,一項事務 transaction 是由一條或多條運算元據庫的 sql 語句組成的乙個不可分割的工作單元,這些操作要麼都完成,要麼都取消。接下來將圍繞事務的特性 併發問題以及隔離級別進行講解。事務的定義很嚴格,它必須同時滿足四個特性,即原子性 一致性 隔離性和永續性,也就是人們俗稱的 ...

事務的四大特性和隔離級別

事務又分為本地事務和分布式事務 本地事務也稱為資料庫事務或傳統事務 相對於分布式事務而言 它的執行模式就是常見的 transaction begin insert delete update insert delete update transaction commit rollback 本地事務有...