事務的ACID特性:
1、Atomicity原子性 ?事務操作的不可分割性,要么全部執行,要么回滾。
2、Consistency一致性 ?數據庫在事務處理前后處于的一致性狀態。如銀行轉賬,兩個賬戶轉賬前的狀態和轉賬后的狀態必須一致。
3、Isolation隔離性 同一時刻執行多個事務,一個事務的執行不能被其他事務干擾。
4、Durability持久性 持久性指一旦成功執行,在系統中產生的所有變化將是永久的。
事務的隔離級別是事務并發控制的整體解決方案,是綜合利用各種類型的鎖機制解決并發問題的整體解決方案。
首先了解一下常見的并發問題:
1、臟讀:一個事務可以讀到另一個事務未提交的數據,違背了事務的隔離性原則。
2、不可重復讀:同一個事務內,兩條相同的查詢語句的查詢結果不一致。
3、幻讀:屏蔽了對其他用戶修改數據的查詢,等到提交時發現出錯了。
這三個并發問題的出現都是在前一問題的基礎之上發生的,
比如,臟讀問題可以這樣理解,客戶A從數據庫讀取數據行到內存并修改,但是還沒有提交,此時客戶B也要讀取這一行,但是這個讀取是在內存中讀取的客戶A未提交的數據。
?不可重復讀是在解決了臟讀的情況下,不再讀取未提交的數據,而是從數據庫中直接讀取已經提交的數據,但是這樣會在同一事務中產生一個問題,就是兩次查詢的結果可能不一致,比如第一次查詢在客戶端提交前,第二次查詢在客戶端提交后,結果這兩次查詢結果不一致。
幻讀問題是在解決了不可重復讀問題的前提下,即同一事務中重復查詢的結果一致,但是這又會產生新的問題,比如第一次查詢是否存在某個用戶,假設不存在,此時客戶B插入這個用戶,此時這個事務的隔離界別是可重復讀,那么再次查詢這個用戶肯定還是不存在,但是此時數據庫中已經存在了這個用戶,客戶A再次插入的話必然會產生duplicate錯誤。
為了解決這些并發問題,SQL定義了四種隔離級別:
read uncommitted(讀取未提交的數據) ? ?可能存在 ?以上三種問題
read commited 讀取提交的數據 ? ?解決了臟讀問題 ? 但是存在不可重復讀和幻讀
repeated read 可重復讀 ? ? ?解決了臟讀和不可重復讀,但是存在幻讀現象
serializable 串行化 ? 解決了臟讀,不可重復讀和幻讀現象,但是發生了鎖等待現象,降低了事務間的并發訪問性能。