事務的隔離級別其實是sql語言的標準,這裡我就以自己比較常用的mysql資料庫為例進行介紹。
關於關係型資料庫和非關係型資料庫的對比,我之前寫過一篇文章簡單地作了一些介紹,隔離級別是acid原則中的第三點 isolation隔離性的重要內容。
有興趣的讀者可以出門左轉,檢視我之前的隨筆。
set [session | global] transaction isolation level
關於以上命令,有一些需要理解的點:
1)級別順序 read uncommittd < read committed < repeatable read < serializable
我的理解是每乙個級別都是在上一級別的基礎上增加了表操作的限制。讀者往下看就可以體會到這種限制的加強。
2)預設行為(不帶session和global)是為下乙個(未開始)事務設定隔離級別。如果使用global關鍵字,此命令語句在全域性中對從那點開始建立的所有新連線(除了不存在的連線)設定事務級別。注意需要super許可權做這個改變。使用session 關鍵字為當前連線上執行的事務設定預設事務級別。另外, 任何客戶端都能自由改變會話隔離級別(甚至在事務的中間),或者為下乙個事務設定隔離級別。
具體操作讀者可以同時開啟多個終端,建立多個mysql連線。在mysql互動模式下直接輸入以上的命令就可以體會一下以上不同級別的讀寫區別了。
下面是對四個隔離級別的介紹
1. read uncommitted 可以讀取未提交的事務
在乙個事務中執行查詢操作,另外乙個事務例項中執行更新或者插入操作,這些操作的資料是沒有提交到磁碟或者資料庫客戶端的,那麼第乙個事務查詢操作讀取的資料可能是不真實的。即出現了所謂的髒讀。
2. read committed 讀取提交事務
在read uncommitted的基礎上限制對未提交事務的查詢操作的限制。也支援所謂的(nonrepeatable read)不可重複讀。
不可重複讀,其實實際理解上是不要求重複讀,即乙個事務(這裡的事務指的是乙個使用者對資料庫的操作,在退出對資料庫操作前都為同乙個事務)前後兩次的讀取內容可以是不同的,即允許在本事務查詢的過程中其他事務對本事務查詢的資料進行更新/增加其他行(相對於一定範圍而言),這樣就會出現兩次讀取的不一致性。
3. repeatable read 可重複讀
在read committed的基礎上限制本事務在執行查詢操作的時候其他事務對本查詢範圍內的資料的修改操作,但允許插入新的資料。所以在本事務的前後兩次範圍(這裡特指範圍查詢,因為非範圍查詢不會出現後面所述現象)查詢中會出現幻讀現象,即兩次讀取的資料量不同。innodb和falcon儲存引擎通過多版本併發控制(mvcc,multiversion concurrency control)機制解決了該問題。關於這個強大的機制也許在之後的學習當中,會寫寫自己的一些學習心得。
4. serilizable 序列化
資料庫最高端別的隔離限制,即乙個事務在執行查詢操作的時候,不允許其他事務對本事務查詢範圍內的資料有任何操作,這裡會引入乙個共享鎖的概念,即本事務的查詢操作別讀取的資料鎖住了,必須等本事務完成之後才允許其他事務獲取這個共享鎖進行其他操作。
好了,理論介紹到這裡,具體的區別還需要動手操作一下去體會的,而至於在實戰中怎麼使用,還是要看具體的資料量和業務邏輯來進行選擇。
聊聊MySQL事務的特性和隔離級別
網上對於此類的文章已經十分飽和了,那還寫的原因很簡單 作為自己的理解筆記。前言此篇文章作為自己學習mysql的一些個人理解,使用的引擎是innodb。首先先講講事務的概念,在 高效能mysql 第三版中其對事務的描述是這樣的 事務就是一組原子性的sql查詢,或者說乙個獨立的工作單元。如果資料庫引擎能...
資料庫事務的4個隔離級別
資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable 這四個級別可以逐個解決髒讀 不可重複讀 幻讀 這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted re...
SQL中事務的隔離級別
sql server隔離 收藏 sql server隔離語句如下 set transaction isolation level read uncommitted read committed repeatable read snapshot serializable 一次只能設定乙個隔離級別選項,...