1. 程式人生 > >MySQL資料庫事務隔離級別(Transaction Isolation Level)

MySQL資料庫事務隔離級別(Transaction Isolation Level)

今天在學習JDBC的時候看到了關於MySql的事務的隔離級別的問題,感覺內容挺高階的,所以記錄一篇文章,以備後面使用。

資料庫隔離級別有四種,應用《高效能mysql》一書中的說明:

然後說說修改事務隔離級別的方法:

1.全域性修改,修改mysql.ini配置檔案,在最後加上

1 #可選引數有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.
2 [mysqld]
3 transaction-isolation = REPEATABLE-READ

這裡全域性預設是REPEATABLE-READ,其實MySQL本來預設也是這個級別

2.對當前session修改,在登入mysql客戶端後,執行命令:

set session transaction isolation level read uncommitted;

要記住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會獲取這一行資料的排它鎖,需要等到前一個事務釋放該排它鎖才可以繼續進行

鎖的範圍:

行鎖: 對某行記錄加上鎖

表鎖: 對整個表加上鎖

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

下面來說說不同的事務隔離級別的例項效果,例子使用InnoDB,開啟兩個客戶端A,B,在A中修改事務隔離級別,在B中開啟事務並修改資料,然後在A中的事務檢視B的事務修改效果(兩個客戶端相當於是兩個連線,在一個客戶端中的修改引數變數的值是不會影響到另外的一個客戶端的):

1.READ-UNCOMMITTED(讀取未提交內容)級別

  1)A修改事務級別並開始事務,對user表做一次查詢

   

  2)B更新一條記錄

   

  3)此時B事務還未提交,A在事務內做一次查詢,發現查詢結果已經改變

   

  4)B進行事務回滾

   

  5)A再做一次查詢,查詢結果又變回去了

   

  6)A表對user表資料進行修改

   

  7)B表重新開始事務後,對user表記錄進行修改,修改被掛起,直至超時,但是對另一條資料的修改成功,說明A的修改對user表的資料行加行共享鎖(因為可以使用select)

   

  可以看出READ-UNCOMMITTED隔離級別,當兩個事務同時進行時,即使事務沒有提交,所做的修改也會對事務內的查詢做出影響,這種級別顯然很不安全。但是在表對某行進行修改時,會對該行加上行共享鎖

2. READ-COMMITTED(讀取提交內容)

  1)設定A的事務隔離級別,並進入事務做一次查詢

   

  2)B開始事務,並對記錄進行修改

   

  3)A再對user表進行查詢,發現記錄沒有受到影響

   

  4)B提交事務

   

  5)A再對user表查詢,發現記錄被修改

   

  6)A對user表進行修改

   

  7)B重新開始事務,並對user表同一條進行修改,發現修改被掛起,直到超時,但對另一條記錄修改,卻是成功,說明A的修改對user表加上了行共享鎖(因為可以select)

   

   

  READ-COMMITTED事務隔離級別,只有在事務提交後,才會對另一個事務產生影響,並且在對錶進行修改時,會對錶資料行加上行共享鎖

3. REPEATABLE-READ(可重讀)

  1)A設定事務隔離級別,進入事務後查詢一次

   

  2)B開始事務,並對user表進行修改

   

  3)A檢視user表資料,資料未發生改變

   

  4)B提交事務

   

  5)A再進行一次查詢,結果還是沒有變化

   

  6)A提交事務後,再檢視結果,結果已經更新

   

  7)A重新開始事務,並對user表進行修改

   

  8)B表重新開始事務,並對user表進行修改,修改被掛起,直到超時,對另一條記錄修改卻成功,說明A對錶進行修改時加了行共享鎖(可以select)

   

   

  REPEATABLE-READ事務隔離級別,當兩個事務同時進行時,其中一個事務修改資料對另一個事務不會造成影響,即使修改的事務已經提交也不會對另一個事務造成影響。

  在事務中對某條記錄修改,會對記錄加上行共享鎖,直到事務結束才會釋放。

4.SERIERLIZED(可序列化)

  1)修改A的事務隔離級別,並作一次查詢

   

  2)B對錶進行查詢,正常得出結果,可知對user表的查詢是可以進行的

   

  3)B開始事務,並對記錄做修改,因為A事務未提交,所以B的修改處於等待狀態,等待A事務結束,最後超時,說明A在對user表做查詢操作後,對錶加上了共享鎖

   

  SERIALIZABLE事務隔離級別最嚴厲,在進行查詢時就會對錶或行加上共享鎖,其他事務對該表將只能進行讀操作,而不能進行寫操作。

相關推薦

MySQL資料庫事務隔離級別(Transaction Isolation Level)

今天在學習JDBC的時候看到了關於MySql的事務的隔離級別的問題,感覺內容挺高階的,所以記錄一篇文章,以備後面使用。 資料庫隔離級別有四種,應用《高效能mysql》一書中的說明: 然後說說修改事務隔離級別的方法: 1.全域性修改,修改mysql.in

遇到mysql資料庫事務隔離級別相關的小坑

幾乎所有軟體工程師都知道,mysql有4種事務隔離級別,但是實際開發過程中可能有時候忽略這個小細節,有時候可能是本來就沒有考慮過,有時候也可能是其他的原因,比如我這次踩到的小坑。 事情還原: 1、需求一:是新建一個商戶,但是客戶要求在建立商戶的時候要預設給他們開

mysql關於資料庫事務隔離級別測試(包含例項測試語句,及測試結果對比)

1、知識點; 事務的四大特性 ACID ;  原子性(Atomic):事務是一個整體(無論在該事務中操作任何CRUD),要不全部執行,要不全部不執行。(資料庫能夠進行操作的最小的邏輯單元) 一致性(Consistent):組成一個事務的操作是CRUD,要麼全部成功,要

mysql事務隔離級別

too con jpg 級別 tran 開啟 數據行 修改 ges 原文地址:http://www.cnblogs.com/snsdzjlz320/p/5761387.html [Mysql]——通過例子理解事務的4種隔離級別 SQL標準定義了4種隔離級別,包括了一

mysql 不同事務隔離級別

結果 讀取 般的 lec 不同的 新增 比較 一次 基礎 repeatable read 在同一事務中,同一查詢多次進行時候,由於其他插入操作(insert)的事務提交,導致每次返回不同的結果集。 標準的repeatable read是允許幻讀的,因為這一級別只在讀取過的紀

談談MySQL事務隔離級別

提交 執行過程 操作 dnf 情況 以及 讀取 int 並且 這篇文章能夠闡述清楚跟數據庫相關的四個概念:事務、數據庫讀現象、隔離級別、鎖機制   一、事務 先來看下百度百科對數據庫事務的定義:   作為單個邏輯單元執行一系列操作,要麽完全執行,要麽完全不執行。事務處理可以

針對資料庫事務隔離級別的討論期待你的參與

af8k10嗣古陀呢胖鞠《http://baobao.baidu.com/question/5b160dce5375bd9862cb9441667e517e?PL》 cxi1z6匱克壯虐刺籃《http://baobao.baidu.com/question/11766989b

MySQL實戰 | 03 - 誰動了我的資料:淺析MySQL事務隔離級別

原文連結:這一次,帶你搞清楚MySQL的事務隔離級別! 使用過關係型資料庫的,應該都事務的概念有所瞭解,知道事務有 ACID 四個基本屬性:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和永續性(Durability),今天我們主要來理解一下事務的隔離性。

資料庫事務隔離級別-- 髒讀、幻讀、不可重複讀(清晰解釋)

一、資料庫事務隔離級別 資料庫事務的隔離級別有4個,由低到高依次為Read uncommitted 、Read committed 、Repeatable read 、Serializable ,這四個級別可以逐個解決髒讀 、不可重複讀 、幻讀 這幾類問題。 √: 可能出

資料庫事務隔離級別-- 髒讀、幻讀、不可重複讀

一 、資料庫事務隔離級別 從高到低: 序列化    serilizable      消耗資源比較嚴重 重複讀    repeatable read    Oracle 預設的事務隔離級別 讀提交    read committed    Mysql 預設的隔離級別

Mysql資料庫隔離級別

Mysql資料庫的隔離級別有四種 1.read umcommitted   讀未提交(當前事務可以讀取其他事務沒提交的資料,會讀取到髒資料) 2.read committed 讀已提交(當前事務不能讀取其他事務沒提交的資料,只能讀取其他事務已經提交的資料,但會出現每次讀取的資料都會不同) 3.

資料庫事務隔離級別,ACID,spring事務傳播性

ACID,是指在資料庫管理系統(DBMS)中事務所具有的四個特性:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、永續性(Durability)。 在資料庫系統中,一個事務是指由一系列資料庫操作組成的一個完整的邏輯過程。例如銀行轉帳,從原賬戶扣除金額

資料庫事務隔離級別與併發產生的問題

資料庫的可序列化保證了那些可序列性的事務進行極小的併發度。同時SQL標準也規定對於不要求精確結果的長事務可以以不可序列化的方式執行。 資料庫的隔離級別有4個,由低到高依次為Read uncommitted、Read committed、Repeatable read、Se

MySQL InnoDB事務隔離級別髒讀、可重複讀、幻讀

望通過本文,可以加深讀者對ySQL InnoDB的四個事務隔離級別,以及髒讀、不重複讀、幻讀的理解。 有四級,預設是“可重複讀”(REPEATABLE READ)。 ·        未提交讀(READUNCOMMITTED)。另一個事務修改了資料

資料庫事務隔離級別,及髒讀,幻讀,虛讀

轉載:http://blog.csdn.net/u013474436/article/details/53437220 事務的特性: 原子性:指處於同一個事務中的多條語句是不可分割的。一致性:事務必須使資料庫從一個一致性狀態變換到另外一個一致性狀態。比如轉賬,轉賬前兩個

Spring的事務隔離級別isolation

隔離為了解決事務併發問題(髒讀、幻讀、不可重複讀),隔離級別就是解決這 些問題的等級。ISOLATION_DEFAULT  使用後端資料庫預設的隔離級別。ISOLATION_READ_UNCOMMIT

mysql-Innodb事務隔離級別-repeatable read詳解

經驗總結: python使用MySQLdb資料庫後,如使用多執行緒,每個執行緒建立一個db連結,然後再各自建立一個遊標cursor,其中第一個執行緒讀一個表中資料為空,第二個寫入該表一條資料並提交,第一個執行緒再讀該表資料將仍然無法讀出。和多資料庫的事務級別應該有關係;還可

資料庫事務隔離級別例項探討

我們知道,資料一般有如下四種隔離級別 0.  read uncommitted (讀未提交)1.  read committed (讀已提交)2.  repeatabale read (可重複讀)3.  serializable read (序列化讀) 下面通過例項介紹這

資料庫事務隔離級別,髒讀、不可重複讀、幻讀

資料庫事務的隔離級別有4個,由低到高依次為Read uncommitted 、Read committed 、Repeatable read 、Serializable  ,後面三個可以逐個解決髒讀 、不可重複讀 、幻讀 這幾類問題。 髒讀 不可重複讀 幻讀 Read u

資料庫事務隔離級別測試-postgresql

1. read-committed (default 級別) 客戶端A: epmdb=> start transaction ; START TRANSACTION epmdb=> update t1.dbversion  set  value =1200  w