事物的隔離級別

2021-07-26 03:59:46 字數 1787 閱讀 2165

一.事物隔離級別的解析:

1.不可重複讀(non-repeatable reads):乙個事務對同一行資料重複讀取兩次,但是卻得到了不同的結果。

2. 幻讀(phantom reads):事務在操作過程中進行兩次查詢,第二次查詢的結果包含了第一次查詢中未出現的資料或者缺少了第一次查詢中出現的資料(這裡並不要求兩次查詢的sql語句相同)。這是因為在兩次查詢過程中有另外乙個事務插入資料造成的。

3.髒讀(dirty read):讀取未提交資料

注意:要記住mysql有乙個autocommit引數,預設是on,他的作用是每一條單獨的查詢都是乙個事務,並且自動開始,自動提交(執行完以後就自動結束了,如果你要適用select for update,而不手動呼叫 start transaction,這個for update的行鎖機制等於沒用,因為行鎖在自動提交後就釋放了),所以事務隔離級別和

鎖機制即使你不顯式呼叫start transaction,這種機制在單獨的一條查詢語句中也是適用的,分析鎖的運作的時候一定要注意這一點

鎖機制:

共享鎖:由讀表操作加上的鎖,加鎖後其他使用者只能獲取該錶或行的共享鎖,不能獲取排它鎖,也就是說只能讀不能寫

排它鎖:由寫表操作加上的鎖,加鎖後其他使用者不能獲取該錶或行的任何鎖,典型是mysql事務中的

鎖的範圍:

行鎖:對某行記錄加上鎖

表鎖:對整個表加上鎖

這樣組合起來就有,行級共享鎖,表級共享鎖,行級排他鎖,表級排他鎖

start transaction;

select * from user where userid = 1 for update;

執行完這句以後

1)當其他事務想要獲取共享鎖,比如事務隔離級別為serializable的事務,執行

select * from user;

將會被掛起,因為serializable的select語句需要獲取共享鎖

2)當其他事務執行

select * from user where userid = 1 for update;

update user set userage = 100 where userid = 1; 

也會被掛起,因為for update會獲取這一行資料的排它鎖,需要等到前乙個事務釋放該排它鎖才可以繼續進行

二.mysql修改事務隔離級別

用 set transation 句改變單個回話或者說有新進連線的隔離劑別

set [session | global] transaction isolation level

1.查詢全域性和會話事務隔離級別

select

@@global.tx_isolation;

select

@@session.tx_isolation;

select

@@tx_isolation;

事物隔離級別

自然也是支援四種事務隔離級別的 read uncommitted,read commit,repeatable read serializable,下面就分別最四種隔離級別在實現的鎖機制做乙個簡介 serializable 1 這種隔離級別對資料的要求最為嚴格,自然也是效能最差的一種隔離級別。在所有...

事物隔離級別

隔離級別從松到緊 讀未提交,讀提交 重複讀,序列化。讀未提交 可能會出現髒讀的情況 例子 你去買5個包子。人多。店員拿的急多方乙個,袋子裡有6個,這個時候,你眼睛一瞟。心裡美滋滋。付錢的時候老闆檢查了一下,發現多了乙個,就拿走了乙個,然後你付錢走人 提交事務 這時候你就發現實際上袋子裡只有5個,但是...

事物隔離級別

在分布式的系統中,通常會有多個執行緒連線到資料庫中同時對乙個表進行操作 這裡的同時並不表示同乙個時間點,而是同時競爭cpu的資源,至於如何排程,就要看執行緒和作業系統如何進行排程了 這種情況下如果會話的事物設定不當,就會導致資料混亂,常常會出現以下三種情況 假設現在系統中有兩個會話a和b,同時對錶t...