按照隔離的級別由低到高,越高的隔離,效率越差
0)、default 預設隔離級別,由資料庫的資料隔離級別確定隔離級別
1)、read_uncommiytted 都未提交的 級別最低
允許別的事務,去讀取這個事務為提交之前的資料
缺點:可能會造成髒讀、幻讀、不可重複讀。
例子講解:店家對1000元商品進行降價500處理,資料更改,但未提交事務;
然後你查到降價將貨物並提交訂單; 可是商家由於操作異常,資料回滾,返回原**1000;
這樣,在店家那邊是沒有操作成功的,可是在你這裡卻得到了降價貨物訂單。
可理解為:外層更改**的事務拉長執行,在執行之中出現提交訂單的事情,你讀了別人正在處理的資料。
2)、read_committed 讀已提交級別
案例講解:你原本查詢商品**為500,第二次為了證明真的降價了再查卻發現並沒有降價。
缺點:兩次讀的都是真的(不髒讀) 可是卻存在不可重複
可以理解為: 你兩次查詢為一次事務,將此事務拉長;
在此事務中間,有更改**的操作,可能執行了多次,可是在這個多次執行修改中你無法插進去查一次;
只能等他更改完(中間事務結束)才能進行下一次查詢,你讀的期間別人插進來對資料操作了。
兩件事務出現了交集。
3)、repeatable_read 可重複讀 事務是多次讀取,得到的相同的值。
缺點: 會出現幻讀
即該事務執行期間,不允許其他事務對該事務資料進行操作,保證該事物中多次對資料的查詢結果一致。
就是你多次查詢的這個事務包含多條資料,為了保證讀取的一致性,可重複讀(repeatable_read)將使用的資料鎖起來不讓別人用。
4)、serializable 序列化讀 將事務排序,逐個執行事務提交了之後才會繼續執行下乙個事務。
缺點:都隔離開了,效率慢
就是上面的可重複讀(repeatable_read)是將使用的資料範圍鎖起來不讓別人用,而這裡是將涉及資料的表全都鎖起來,不允許別人操作。
這個事務的執行中,別的事務連在旁邊看的機會都沒有,完全不會有影響,你讀的時候別人看不到,隔離開,單獨執行
。整個事務排隊執行
編輯資料庫是要被廣大客戶所共享訪問的,那麼在
資料庫操作過程中很可能出現以下幾種不確定情況。
兩個事務都同時更新一行資料,乙個事務對資料的更新把另乙個事務對資料的更新覆蓋了。這是因為系統沒有執行任何的鎖操作,因此併發事務並沒有被隔離開來。
乙個事務讀取到了另乙個事務未提交的資料操作結果。這是相當危險的,因為很可能所有的操作都被
回滾。不可重複讀(non-repeatable reads):乙個事務對同一行資料重複讀取兩次,但是卻得到了不同的結果。
包括以下情況:
(1) 虛讀:事務t1讀取某一資料後,事務t2對其做了修改,當事務t1再次讀該資料時得到與前一次不同的值。
(2)
幻讀(phantom reads):事務在操作過程中進行兩次查詢,第二次查詢的結果包含了第一次查詢中未出現的資料或者缺少了第一次查詢中出現的資料(這裡並不要求兩次查詢的
sql語句相同)。這是因為在兩次查詢過程中有另外乙個事務插入資料造成的。
為了避免上面出現的幾種情況,在標準
sql規範中,定義了4個事務隔離級別,不同的隔離級別對事務的處理不同。
未授權讀取
也稱為讀未提交(read uncommitted):允許髒讀取,但不允許更新丟失。如果乙個事務已經開始寫資料,則另外乙個事務則不允許同時進行寫操作,但允許其他事務讀此行資料。該隔離級別可以通過「排他寫鎖」實現。
授權讀取
也稱為讀提交(read committed):允許
不可重複讀取,但不允許髒讀取。這可以通過「瞬間共享讀鎖」和「排他寫鎖」實現。讀取資料的事務允許其他事務繼續訪問該行資料,但是未提交的寫事務將會禁止其他事務訪問該行。
可重複讀取(repeatable read)
可重複讀取(repeatable read):禁止
不可重複讀取和髒讀取,但是有時可能出現幻讀資料。這可以通過「共享讀鎖」和「排他寫鎖」實現。讀取資料的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事務。
序列化(serializable)
序列化(serializable):提供嚴格的事務隔離。它要求事務
序列化執行,事務只能乙個接著乙個地執行,不能併發執行。僅僅通過「行級鎖」是無法實現事務序列化的,必須通過其他機制保證新插入的資料不會被剛執行查詢操作的事務訪問到。
隔離級別越高,越能保證資料的完整性和一致性,但是對併發效能的影響也越大。對於多數應用程式,可以優先考慮把
資料庫系統的隔離級別設為read committed。它能夠避免髒讀取,而且具有較好的併發效能。儘管它會導致
不可重複讀、幻讀和第二類丟失更新這些併發問題,在可能出現這類問題的個別場合,可以由應用程式採用
悲觀鎖或
樂觀鎖來控制。
事務的隔離級別舉例 事務的隔離級別
乙個事務是乙個完整的業務邏輯單元,不能再分,要麼全部執行成功,要麼全部失敗。比如 a給b轉賬100元,a的銀行卡就會少100元,b的銀行卡就會多100元,整個過程要麼全部執行成功,要麼全部失敗。a 原子性。事務是最小的業務邏輯單元。b 一致性。乙個事務必須保證多條dml語句同時成功或失敗。c 隔離性...
事務的隔離級別舉例 JDBC 事務隔離級別
本文總結了 jdbc 事務隔離級別。事務隔離級別定義了在乙個事務中,哪些資料是對當前執行的語句 可見 的。在併發訪問資料庫時,事務隔離級別定義了多個事務之間對於同個目標資料來源訪問時的可交叉程度。可交叉程度可分為以下幾類。可交叉程度 dirty reads 髒讀 當乙個事務能看見另外乙個事務未提交的...
事務的隔離級別舉例 JDBC事務隔離級別
一組要麼同時執行成功,要麼同時執行失敗的sql語句。是資料庫操作的乙個執行單元。斷開與資料庫的連線 表示乙個事務內的所有操作是乙個整體,要麼全部成功,要麼全部失敗 表示乙個事務內有乙個操作失敗時,所有的更改過的資料都必須回滾到修改前狀態 事務檢視資料時資料所處的狀態,要麼是另一併發事務修改它之前的狀...