如何檢視mysql資料庫隔離級別

2022-05-05 03:13:45 字數 3788 閱讀 2484

1樓:從哲妍

mysql預設的事務處理級別是'repeatable-read',也就是可重複讀

1.檢視當前會話隔離級別

select @@tx_isolation;

2.檢視系統當前隔離級別

select @@global.tx_isolation;

3.設定當前會話隔離級別

set session transaction isolatin level repeatable read;

4.設定系統當前隔離級別

set global transaction isolation level repeatable read;

mysql 隔離級別設定為什麼比較好

2樓:龍氏風采

一、首先什麼是事務?

事務是應用程式中一系列嚴密的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務具有原子性,乙個事務中的一系列的操作要麼全部成功,要麼乙個都不做。

事務的結束有兩種,當事務中的所以步驟全部成功執行時,事務提交。如果其中乙個步驟失敗,將發生回滾操作,撤消撤消之前到事務開始時的所以操作。

二、事務的 acid

事務具有四個特徵:原子性( atomicity )、一致性( consistency )、隔離性( isolation )和持續性( durability )。這四個特性簡稱為 acid 特性。

1 、原子性。事務是資料庫的邏輯工作單位,事務中包含的各操作要麼都做,要麼都不做2 、一致性。事 務執行的結果必須是使資料庫從乙個一致性狀態變到另乙個一致性狀態。

因此當資料庫只包含成功事務提交的結果時,就說資料庫處於一致性狀態。如果資料庫系統 執行中發生故障,有些事務尚未完成就被迫中斷,這些未完成事務對資料庫所做的修改有一部分已寫入物理資料庫,這時資料庫就處於一種不正確的狀態,或者說是 不一致的狀態。

3 、隔離性。乙個事務的執行不能其它事務干擾。即乙個事務內部的操作及使用的資料對其它併發事務是隔離的,併發執行的各個事務之間不能互相干擾。

4 、持續性。也稱永久性,指乙個事務一旦提交,它對資料庫中的資料的改變就應該是永久性的。接下來的其它操作或故障不應該對其執行結果有任何影響。

三、mysql的四種隔離級別

sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的併發處理,並擁有更低的系統開銷。

read uncommitted(讀取未提交內容)

在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,因為它的效能也不比其他級別好多少。讀取未提交的資料,也被稱之為髒讀(dirty read)。

read committed(讀取提交內容)

這是大多數資料庫系統的預設隔離級別(但不是mysql預設的)。它滿足了隔離的簡單定義:乙個事務只能看見已經提交事務所做的改變。

這種隔離級別 也支援所謂的不可重複讀(nonrepeatable read),因為同一事務的其他例項在該例項處理其間可能會有新的commit,所以同一select可能返回不同結果。

repeatable read(可重讀)

這是mysql的預設事務隔離級別,它確保同一事務的多個例項在併發讀取資料時,會看到同樣的資料行。不過理論上,這會導致另乙個棘手的問題:幻讀 (phantom read)。

簡單的說,幻讀指當使用者讀取某一範圍的資料行時,另乙個事務又在該範圍內插入了新行,當使用者再讀取該範圍的資料行時,會發現有新的「幻影」 行。innodb和falcon儲存引擎通過多版本併發控制(mvcc,multiversion concurrency control)機制解決了該問題。

serializable(可序列化)

這是最高的隔離級別,它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它是在每個讀的資料行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖競爭。

這四種隔離級別採取不同的鎖型別來實現,若讀取的是同乙個資料的話,就容易發生問題。例如:

髒讀(drity read):某個事務已更新乙份資料,另乙個事務在此時讀取了同乙份資料,由於某些原因,前乙個rollback了操作,則後乙個事務所讀取的資料就會是不正確的。

不可重複讀(non-repeatable read):在乙個事務的兩次查詢之中資料不一致,這可能是兩次查詢過程中間插入了乙個事務更新的原有的資料。

幻讀(phantom read):在乙個事務的兩次查詢中資料筆數不一致,例如有乙個事務查詢了幾列(row)資料,而另乙個事務卻在此時插入了新的幾列資料,先前的事務在接下來的查詢中,就會發現有幾列資料是它先前所沒有的。

在mysql中,實現了這四種隔離級別,分別有可能產生問題如下所示:

四、測試mysql的隔離級別

下面,將利用mysql的客戶端程式,我們分別來測試一下這幾種隔離級別。

測試資料庫為demo,表為test;表結構:

兩個命令列客戶端分別為a,b;不斷改變a的隔離級別,在b端修改資料。

(一)、將a的隔離級別設定為read uncommitted(未提交讀)a:啟動事務,此時資料為初始狀態

b:啟動事務,更新資料,但不提交

a:再次讀取資料,發現資料已經被修改了,這就是所謂的「髒讀」

b:回滾事務

a:再次讀資料,發現資料變回初始狀態

經過上面的實驗可以得出結論,事務b更新了一條記錄,但是沒有提交,此時事務a可以查詢出未提交記錄。造成髒讀現象。未提交讀是最低的隔離級別。

(二)、將客戶端a的事務隔離級別設定為read committed(已提交讀)a:啟動事務,此時資料為初始狀態

b:啟動事務,更新資料,但不提交

a:再次讀資料,發現資料未被修改

b:提交事務

a:再次讀取資料,發現資料已發生變化,說明b提交的修改被事務中的a讀到了,這就是所謂的「不可重複讀」

經過上面的實驗可以得出結論,已提交讀隔離級別解決了髒讀的問題,但是出現了不可重複讀的問題,即事務a在兩次查詢的資料不一致,因為在兩次查詢之間事務b更新了一條資料。已提交讀只允許讀取已提交的記錄,但不要求可重複讀。

(三)、將a的隔離級別設定為repeatable read(可重複讀)a:啟動事務,此時資料為初始狀態

b:啟動事務,更新資料,但不提交

a:再次讀取資料,發現資料未被修改

b:提交事務

a:再次讀取資料,發現資料依然未發生變化,這說明這次可以重複讀了b:插入一條新的資料,並提交

a:再次讀取資料,發現資料依然未發生變化,雖然可以重複讀了,但是卻發現讀的不是最新資料,這就是所謂的「幻讀」

a:提交本次事務,再次讀取資料,發現讀取正常了由以上的實驗可以得出結論,可重複讀隔離級別只允許讀取已提交記錄,而且在乙個事務兩次讀取乙個記錄期間,其他事務部的更新該記錄。但該事務不要求與其他事務可序列化。

例如,當乙個事務可以找到由乙個已提交事務更新的記錄,但是可能產生幻讀問題(注意是可能,因為資料庫對隔離級別的實現有所差別)。像以上的實驗,就沒有出現資料幻讀的問題。

(四)、將a的隔離級別設定為可序列化(serializable)a:啟動事務,此時資料為初始狀態

b:發現b此時進入了等待狀態,原因是因為a的事務尚未提交,只能等待(此時,b可能會發生等待超時)a:提交事務

b:發現插入成功

serializable完全鎖定字段,若乙個事務來查詢同乙份資料就必須等待,直到前乙個事務完成並解除鎖定為止。是完整的隔離級別,會鎖定對應的資料**,因而會有效率的問題。

資料庫事務的四個隔離級別,mysql在哪乙個級別

3樓:匿名使用者

mysql的innodb引擎對四個隔離級別都支援,

預設是repeated read。

如何連線遠端Mysql資料庫

安裝資料庫連線軟體 需要知道host,使用者和密碼。使用mysql font軟體連線資料庫。在連線資訊總輸入資訊,點選確定,連線成功 如是在內網,輸入伺服器ip 使用者名稱,密碼即可 如果是外網連線,有固定ip位址的,有防火牆的要做策略,做對映等.首先mysql得開啟外網訪問許可權 其次在程式中連線...

mysql資料庫查詢的問題,mysql 資料庫查詢的乙個問題

select from select t.num if category id t.category id,num 1,1 as cal rank,category id t.category id from select from goods order by category id asc go...

mysql資料庫如何執行sql語句

select a drclass1,b drclass2,c drclass3,d drclass4,e drclass5 from teacher where teacherid teacherid create table classname classname char 50 insert i...