對SQL事務隔離級別的簡單理解

2021-06-08 04:40:31 字數 1630 閱讀 8557

資料庫事務(database transaction) ,是指作為單個邏輯工作單元執行的一系列操作。事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過將一組相關操作組合為乙個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程式

更加可靠。

乙個邏輯工作單元要成為事務,必須滿足所謂的acid(原子性、一致性、隔離性和永續性)屬性。即:

l      原子性(atomicity):事務必須是原子工作單元;對於其資料修改

,要麼全都執行,要麼全都不執行。通常,與某個事務關聯的操作具有共同的目標,並且是相互依賴的。如果系統只執行這些操作的乙個子集,則可能會破壞事務的總體目標。原子性消除了系統處理操作子集的可能性。

l      一致性(consistency):在事務處理執行前後,資料庫是一致的(資料庫資料完整性約束)。

l      隔離性(isolcation):為了防止事務直接相互影響,由併發事務所作的修改必須與任何其它併發事務所作的修改隔離。根據不同的要求,隔離級別可以分為四種(序列化,可重複讀,讀已提交,讀未提交)。

l    持續性(durability):事務完成之後,它對於系統的影響是永久性的。該修改即使出現致命的系統故障也將一直保持。

sql標準定義了4類隔離級別分別是:可序列化,可重複讀,讀已提交,讀未提交。

l可序列化serializable

是事務最高的隔離級別

。在此級別上,從一組可並行執行的事務獲得的結果與通過連續執行每個事務所獲得的結果相同。因為它採用了類似執行緒同步的概念,當乙個事務開始運算元據時,其他所有的事務都不能進行除查詢外的其他操作,只能等待當前事務完成提交。由於高度隔離會限制可並行執行的事務數,所以一些應用程式降低隔離級別以換取更大的吞吐量。

l可重複讀repeatable read

這是mysql的預設事務隔離級別,它確保同一事務的多個例項在併發讀取資料時,會看到同樣的資料行。它採用的是資料快取策略,即當事務開始後,第一次讀取資料後會把資料快取起來,當再次進行相同操作時,直接返回快取的資料,這樣即使資料庫內容發生了改變,當前事務內所讀取的結果還是一致的。

l     讀已提交read committed

這是大多數資料庫系統的預設隔離級別(但不是mysql預設的)。它滿足了隔離的簡單定義:乙個事務只能看見已經提交事務所做的改變。乙個事務在結束時會執行乙個命令,commit(提交)或者 rollback(回滾),前者即確認事務所做的操作,後者則為撤銷整個事務的所有操作。此隔離級別的服務將不會看到其他並行服務在commit之前所進行的操作。

l     讀未提交read uncommitted

這是最低的隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,因為它的效能也不比其他級別好多少。讀取未提交的資料,也被稱之為髒讀(dirty read),因為別的服務有可能會執行rollback操作,這樣提前讀取到的資料可能會出現問題。

四種級別的隔離,各有自己的優缺點,級別越高則安全性越高,但併發性越低,低階別的隔離則支援更高的併發處理,並要求較低的系統開銷,究竟使用哪種,還有根據具體專案的相關要求而決定。

事務隔離級別的理解

資料庫事務的隔離級別有4種,由低到高分別為read uncommitted read committed repeatable read serializable 而且,在事務的併發操作中可能會出現髒讀,不可重複讀,幻讀。下面通過事例一一闡述它們的概念與聯絡。read uncommitted 讀未提...

事務隔離級別的個人理解

事務隔離級別是指若干個併發的事務之間的隔離程度。1.read uncommitted 讀未提交,可能出現髒讀 不可從復讀 幻讀 髒讀相對於其他事務 b 來說 本事務 a 做了修改,髒讀是讀到了錯誤資料 a修改 b讀取 a start a update b start b read b end a r...

對不同隔離級別的理解

以下是我個人的理解,有不對的地方,還望博友指出哈。在資料庫中,有4種不同的隔離級別供我們選擇,分別是read uncommited,read commited,repeatable read,serializable。我來依依解釋這四種級別 第乙個,read uncommited,從名字上看,說的是...