mysql的隔離級別的檢視:
select @@tx_isolation;
預設的隔離級別是repeatable-read(可重複讀)。
可通過如下sql語句改變其隔離級別
set transaction isolation level read uncommitted;
寫道在資料庫系統中,隔離 是定義乙個操作對資料所做的改變如何/何時對其它的並行 操作可見。
隔離級別
資料庫系統有四個隔離級別。對資料庫使用何種隔離級別要審慎分析,因為
1. 維護乙個最高的隔離級別雖然會防止資料的出錯,但是卻導致了並行度的損失,以及導致死鎖出現的可能性增加。
2. 然而,降低隔離級別,卻會引起一些難以發現的bug。
在不同的並行控制模式下,對各隔離級別的實現是不同的。
serializable(序列化)
所有的資料庫事務都完全隔離,就如系統中所有的事務都順序執行一樣,乙個接著乙個。當然,資料庫可以同時執行多個事務,只要順序執行的「錯覺」可以維護(即同時執行的多個事務不會互相干擾,或者多個事務的同時執行能保證結果的正確)。
a. 基於鎖的並行控制。(當執行乙個帶有範圍的where子句的查詢時,需要範圍鎖定)
b. 無鎖並行控制。不需要鎖,但是當系統檢測到並行的事務違反了序列化「錯覺」,它會迫使那個事務回退,所以應用程式需要重新啟動那個事務。
幻讀,髒讀,不可重複讀等問題都不會發生。
repeatable read(可重複讀)
所有查詢到的資料記錄都不會被改變。即會在所有獲取的資料上加上讀鎖,但是不會加上範圍鎖。
可能發生的問題:當執行乙個範圍查詢時,可能會發生幻讀。
read committed(提交讀)
乙個查詢所獲取的資料可以被其他事務修改。
讀鎖:在所讀取的資料上新增讀鎖,但會立即釋放。
寫鎖:不會釋放,直到事務完結。
可能發生的問題:不可重複讀。
read uncommitted(未提交讀)
乙個事務可以看見另乙個事務所做的未提交修改。
可能發生的問題:髒讀。
總結:可以看到,對於前三種隔離級別,其實他們的不同是通過對獲取的資料實行不同型別的共享機制來實現,比如新增範圍鎖、讀鎖或者立即釋放讀鎖等來實現,但跟排他鎖無關。
隔離級別新增的共享鎖
序列化範圍鎖
可重複讀讀鎖
提交讀立即釋放讀鎖
而對於第四種隔離級別:未提交讀,乙個事務可以看到另乙個事務未提交的資料。
問題我們看到,當執行不同的隔離級別時,可能會發生各種各樣不同的問題。下面對它們進行總結並舉例說明。
幻讀幻讀發生在當兩個完全相同的查詢執行時,第二次查詢所返回的結果集跟第乙個查詢不相同。
發生的情況:沒有範圍鎖。
例子:事務1事務2
select
* from
users
where
age between
andinsert
into
users values
, 'bob'
, 27
select
* from
users where
age between
and如何避免:實行序列化隔離模式,在任何乙個低階別的隔離中都可能會發生。
不可重複讀
在基於鎖的並行控制方法中,如果在執行select時不新增讀鎖,就會發生不可重複讀問題。
在多版本並行控制機制中,當乙個遇到提交衝突的事務需要回退但卻被釋放時,會發生不可重複讀問題。
事務1事務2
select
* from
users where
id = 1
update
users set
age = 21
where
id = 1
commit; /* in multiversion concurrency*/
control, or lock-based read committed *
select
* from
users where
id = 1
commit; /* lock-based repeatable read */
在上面這個例子中,事務2提交成功,它所做的修改已經可見。然而,事務1已經讀取了乙個其它的值。在序列化和可重複讀的隔離級別中,資料庫管理系統會返回舊值,即在被事務2修改之前的值。在提交讀和未提交讀隔離級別下,可能會返回被更新的值,這就是「不可重複讀」。
有兩個策略可以防止這個問題的發生:
1. 推遲事務2的執行,直至事務1提交或者回退。這種策略在使用鎖時應用。
2. 而在多版本並行控制中,事務2可以被先提交。而事務1,繼續執行在舊版本的資料上。當事務1終於嘗試提交時,資料庫會檢驗它的結果是否和事務1、事務2順序執行時一樣。如果是,則事務1提交成功。如果不是,事務1會被回退。
髒讀髒讀發生在乙個事務a讀取了被另乙個事務b修改,但是還未提交的資料。假如b回退,則事務a讀取的是無效的資料。這跟不可重複讀類似,但是第二個事務不需要執行提交。
事務1事務2
select
* from
users where
id = 1
update
users set
age = 21
where
id = 1
select
from
users where
id = 1
commit; /* lock-based dirty read */
分享到:
2009-03-30 08:17
瀏覽 2155
1 樓oritenson
2010-08-06
學習了,哈哈
檢視修改mysql隔離級別
1.檢視 mysql 8.0 系統級別 select global.transaction isolation 會話級別 select transaction isolation mysql 5.0 select global.tx isolation 2.修改 set global transac...
mysql強隔離公升級 MySQL 隔離級別
一 事務特性 1.原子性 事務是乙個原子操作單元,事務中包含的所有操作要麼都做,要麼都不做,沒有第三種情況。2.一致性 事務操作前和操作後都必須滿足業務規則約束,比如說a向b轉賬,轉賬前和轉賬後ab兩個賬戶的總金額必須是一致的。3.隔離性 隔離性是資料庫允許多個併發事務同時對資料進行讀寫的能力,隔離...
mysql隔離級別 MySQL 事務隔離級別
mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性 undo log 一致性 undo log 永續性 redo log 事務通過鎖機制實現隔離性。1 事務隔離級別與實現read uncommitted 讀未提交 read c...