資料庫事務基本要素ACID

2021-10-25 14:20:46 字數 3031 閱讀 1075

資料庫事務具有4個特徵,分別是原子性一致性隔離性永續性,簡稱事務的acid特性;

乙個事務要麼全部提交成功,要麼全部失敗回滾,不能只執行其中的一部分操作,這就是事務的原子性

事務的執行不能破壞資料庫資料的完整性和一致性,乙個事務在執行之前和執行之後,資料庫都必須處於一致性狀態。

如果資料庫系統在執行過程中發生故障,有些事務尚未完成就被迫中斷,這些未完成的事務對資料庫所作的修改有一部分已寫入物理資料庫,這是資料庫就處於一種不正確的狀態,也就是不一致的狀態

事務的隔離性是指在併發環境中,併發的事務時相互隔離的,乙個事務的執行不能不被其他事務干擾。不同的事務併發操作相同的資料時,每個事務都有各自完成的資料空間,即乙個事務內部的操作及使用的資料對其他併發事務時隔離的,併發執行的各個事務之間不能相互干擾。

在標準sql規範中,定義了4個事務隔離級別,不同的隔離級別對事務的處理不同,分別是:未授權讀取,授權讀取,可重複讀取和序列化

1、讀未提交(read uncommited)

,該隔離級別允許髒讀取,其隔離級別最低;比如事務a和事務b同時進行,事務a在整個執行階段,會將某資料的值從1開始一直加到10,然後進行事務提交,此時,事務b能夠看到這個資料項在事務a操作過程中的所有中間值(如1變成2,2變成3等),而對這一系列的中間值的讀取就是未授權讀取

2、授權讀取或稱讀已提交、不可重複讀(read commited)

授權讀取只允許獲取已經提交的資料。比如事務a和事務b同時進行,事務a進行+1操作,此時,事務b無法看到這個資料項在事務a操作過程中的所有中間值,只能看到最終的10。另外,如果說有乙個事務c,和事務a進行非常類似的操作,只是事務c是將資料項從10加到20,此時事務b也同樣可以讀取到20,即授權讀取允許不可重複讀取。

3、可重複讀(repeatable read)

就是保證在事務處理過程中,多次讀取同乙個資料時,其值都和事務開始時刻是一致的,因此該事務級別禁止不可重複讀取和髒讀取,但是有可能出現幻影資料。所謂幻影資料,就是指同樣的事務操作,在前後兩個時間段內執行對同乙個資料項的讀取,可能出現不一致的結果。在上面的例子中,可重複讀取隔離級別能夠保證事務b在第一次事務操作過程中,始終對資料項讀取到1,但是在下一次事務操作中,即使事務b(注意,事務名字雖然相同,但是指的是另乙個事務操作)採用同樣的查詢方式,就可能讀取到10或20;

4、序列化

是最嚴格的事務隔離級別,它要求所有事務被序列執行,即事務只能乙個接乙個的進行處理,不能併發執行。

讀未提交(read-uncommitted)

會發生髒讀 (b事務還沒有提交,a已經查詢到b操作之後的結果)

不可重複讀(讀已提交)(read-committed)

oracle預設級別 (b提交事務,a兩次查詢結果不同)

可重複讀(repeatable-read)

mysql預設級別 (b提交事務,a兩次查詢結果相同)

序列化(serializable)

mysql中事務隔離級別為serializable時會鎖表,因此不會出現幻讀的情況,這種隔離級別併發性極低,開發中很少會用到。

一旦事務提交,那麼它對資料庫中的對應資料的狀態的變更就會永久儲存到資料庫中。–即使發生系統崩潰或機器宕機等故障,只要資料庫能夠重新啟動,那麼一定能夠將其恢復到事務成功結束的狀態

上面已經大體描述了隔離級別的含義,下面我們就來具體看下mysql是如何實現事務隔離性的?簡單來說,在mysql中,事務的隔離性是通過鎖來實現的。mysql中有三種行鎖演算法,record lock(單行鎖定),gap lock(間隙鎖)和next-key locking(record+gap)。在講之前,還需要說到乙個mysql的特點,那就是mysql有兩種讀取資料的模式,一種是一致性非鎖定讀,另一種是一致性鎖定讀。

1)select … for update (顯式加寫鎖)

2)select … lock in share mode (顯式加讀鎖)

一致性非鎖定讀的含義是當事務讀取的某行資料被其他事務鎖定時,可以不用等待鎖釋放,而是讀取此行的乙個具有一致性的資料快照,而這個快照資料就儲存在undo日誌中。這種一行資料有多個版本的技術也叫做mvcc,即多版本併發控制。mvcc也是乙個通用概念,有多種實現方式,mysql是通過undo日誌來實現的mvcc。

接下來我們繼續講解mysql是如何實現四個隔離級別的:

未提交讀:顯然不需要對行加鎖,這樣其他事務就可以同時訪問此行。

提交讀:在innodb的預設配置下,此隔離級別採用一致性非鎖定讀模式。即如果此行正被其他事務鎖定,那麼mysql通過mvcc技術,當前事務可以讀取此行的乙個最近提交的快照資料。

可重複讀:在innodb的預設配置下,此隔離級別採用一致性非鎖定讀模式。mysql通過next-key locking鎖定乙個範圍,使範圍內的資料不能同時在其他事務中插入,避免了當前事務出現「幻行」問題。mysql通過mvcc,在讀取某行資料時,如果此行被其他事務鎖定,則當前事務不用阻塞,直接讀取當前事務開始時的此行的乙個資料快照,來解決可重複讀問題。即在整個事務中,讀取的始終是此行的同乙個資料快照。mysql的可重複讀已經達到了sql標準的serializable標準,即(無髒讀,可重複讀mvcc,無幻讀next-key locking)。

序列化:序列化執行事務,即發現有其他事務正在操作此行,則此事務阻塞直到其他事務結束。mysql會對每個select加上lock in share mode,不支援一致性非鎖定讀。

擴充套件:我們在真實使用事務的時候,常見場景有通過spring配置資料來源,配置orm對映框架例如mybatis,在使用事務的時候本質上是利用資料庫的api,例如對於mysql來說是begin, commit和rollback等。獲取資料庫連線,開啟事務,提交事務等。spring中的事務傳播機制屬於spring自己的概念,本質上為根據不同的事務傳播機制確定是否利用同乙個連線,或者是否將多個事務邏輯通過同乙個connection或者多個connection中來提交或者回滾,有興趣的可以看下mybatis關於事務的原始碼。

資料庫事務正確執行的四個基本要素 ACID

acid,指資料庫事務正確執行的四個基本要素的縮寫。包含 原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 乙個支援事務 transaction 的資料庫,必須要具有這四種特性,否則在事務過程 transaction process...

ACID 資料庫事務正確執行的四個基本要素

acid 資料庫事務正確執行的四個基本要素 acid,指資料庫事務正確執行的四個基本要素的縮寫。包含 原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 乙個支援事務 transaction 的資料庫系統,必需要具有這四種特性,否則在...

ACID資料庫事務正確執行的四個基本要素的縮寫

acid,指資料庫事務正確執行的四個基本要素的縮寫。包含 原子性 atomicity 一致性 consistency 隔離性 isolation 永續性 durability 乙個支援事務 transaction 的資料庫,必須要具有這四種特性,否則在事務過程 transaction process...