mysql事務隔離最高_Mysql事務隔離級別

mysql官方文檔顯示:

InnoDB中每個隔離級別的詳細描述如下:

· READ UNCOMMITTED

SELECT語句以非鎖定方式被執行,但是一個可能更早期版本的記錄會被用到。因此,使用這個隔離級別,比如,讀是不連貫的。著也被稱為“臟讀”(dirty read)。另外,這個隔離級別象READ COMMITTED一樣作用。

· READ COMMITTED

一個有些象Oracle的隔離級別。所有SELECT ... FOR UPDATE和SELECT ... LOCK IN SHARE MOD語句僅鎖定索引記錄,而不鎖定記錄前的間隙,因而允許隨意緊挨著已鎖定的記錄插入新記錄。UPDATE和DELETE語句使用一個帶唯一搜索條件的唯一的索引僅鎖定找到的索引記錄,而不包括記錄前的間隙。在范圍類型UPDATE和DELETE語句,InnoDB必須對范圍覆蓋的間隙設置next-key鎖定或間隙鎖定以及其它用戶做的塊插入。這是很必要的,因為要讓MySQL復制和恢復起作用,“幽靈行”必須被阻止掉。

持續讀行為如同在Oracle中:即使在同一事務內, 每個持續讀設置并讀取它自己的新快照。請參閱15.2.10.4節,“持續非鎖定讀”。

· REPEATABLE READ

這是InnoDB的默認隔離級別。帶唯一搜索條件使用唯一索引的SELECT ... FOR UPDATE, SELECT ... LOCK IN SHARE MODE, UPDATE 和DELETE語句只鎖定找到的索引記錄,而不鎖定記錄前的間隙。用其它搜索條件,這些操作采用next-key鎖定,用next-key鎖定或者間隙鎖定鎖住搜索的索引范圍,并且阻止其它用戶的新插入。

在持續讀中,有一個與之前隔離級別重要的差別:在這個級別,在同一事務內所有持續讀讀取由第一次讀所確定的同一快照。這個慣例意味著如果你在同一事務內發出數個無格式SELECT語句,這些SELECT語句對相互之間也是持續的,請參閱15.2.10.4節,“持續非鎖定讀”。

· SERIALIZABLE

這個級別類似REPEATABLE READ,但是所有無格式SELECT語句被 隱式轉換成SELECT ... LOCK IN SHARE MODE。

1.事務里一些有問題的讀取:臟讀,不可重復讀,幻象讀

臟讀 (dirty read):事務T1更新了一行記錄的內容,但是并沒有提交所做的修改。事務T2讀取更新后的行,然后T1執行回滾操作,取消了剛才所做的修改。現在T2所讀取的行就無效了。

不可重復讀取 (nonrepeatable read):事務T1讀取一行記錄,緊接著事務T2修改 了T1剛才讀取的那一行記錄。然后T1又再次讀取這行記錄,發現與剛才讀取的結果不同。這就稱為“不可重復”讀,因為T1原來讀取的那行記錄已經發生了變化。

幻像讀取 (phantom read):事務T1讀取一條指定的WHERE子句所返回的結果集。然后事務T2新插入 一行記錄,這行記錄恰好可以滿足T1所使用的查詢條件中的WHERE 子句的條件。然后T1又使用相同的查詢再次對表進行檢索,但是此時卻看到了事務T2剛才插入的新行。這個新行就稱為“幻像”,因為對T1來說這一行就像突 然出現的一樣。

2.事務的隔離級別

從級別低到高依次為:

READ UNCOMMITTED (讀取未提交內容):幻像讀、不可重復讀和臟讀都允許。

READ COMMITTED (讀取已提交內容):允許幻像讀、不可重復讀,但不允許臟讀。

REPEATABLE READ (可重讀):允許幻像讀,但不允許不可重復讀和臟讀。InnoDB默認級別

SERIALIZABLE (可串行化):幻像讀、不可重復讀和臟讀都不允許。

但是InnoDB的可重復讀隔離級別和其他數據庫的可重復讀是有區別的,不會造成幻象讀(phantom read)。

ORACLE數據庫支持 READ COMMITTED 和 SERIALIZABLE ,不支持 READ UNCOMMITTED 和 REPEATABLE READ 。

3、修改事務隔離級別的方法:

全局修改,修改mysql.ini配置文件,在最后加上

#可選參數有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.

[mysqld]

transaction-isolation = REPEATABLE-READ

這里全局默認是REPEATABLE-READ,其實MySQL本來默認也是這個級別

要記住mysql有一個autocommit參數,默認是on,他的作用是每一條單獨的查詢都是一個事務,并且自動開始,自動提交(執行完以后就自動結束了,如果你要適用select for update,而不手動調用 start transaction,這個for update的行鎖機制等于沒用,因為行鎖在自動提交后就釋放了),所以事務隔離級別和鎖機制即使你不顯式調用start transaction,這種機制在單獨的一條查詢語句中也是適用的,分析鎖的運作的時候一定要注意這一點

4、鎖機制:

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

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

5、鎖范圍

行鎖: 對某行記錄加上鎖

表鎖: 對整個表加上鎖

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

6、具體示例

InnoDB下,開啟2個session對同一表操作,時間線往下順序執行:

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

User A             User B

SET AUTOCOMMIT=0;      SET AUTOCOMMIT=0;

time

| ?      SELECT * FROM t;

| ?      返回空結果

| ?                      INSERT INTO t VALUES (1, 2);

|

v       SELECT * FROM t;

返回 1 row in set(User B插入)

ROLLBACK;

SELECT * FROM t;

返回空結果

COMMIT;

so:可以看出READ-UNCOMMITTED隔離級別,當兩個事務同時進行時,即使事務沒有提交,所做的修改也會對其它事務的查詢做出影響,這種級別顯然很不安全。

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

User A             User B

SET AUTOCOMMIT=0;      SET AUTOCOMMIT=0;

time

| ?      SELECT * FROM t;

| ?      返回空結果

| ?                      INSERT INTO t VALUES (1, 2);

|

v       SELECT * FROM t;

返回空結果(未更改)

COMMIT;

SELECT * FROM t;

返回 1 row(UserB插入并提交了)

COMMIT;

so:READ-COMMITTED事務隔離級別,只有在事務提交后,才會對另一個事務產生影響。

3)REPEATABLE-READ(可重讀)

User A             User B

SET AUTOCOMMIT=0;      SET AUTOCOMMIT=0;

time

| ?      SELECT * FROM t;

| ?      返回空結果

| ?                      INSERT INTO t VALUES (1, 2);

|

v       SELECT * FROM t;

返回空結果(未更改)

COMMIT;

SELECT * FROM t;

返回空結果(仍未更改)

COMMIT;

SELECT * FROM t;

返回1 row(新啟事務,查詢到修改)

so:REPEATABLE-READ(可重讀)事務隔離級別,當兩個事務同時進行時,其中一個事務修改數據對另一個事務不會造成影響,即使修改的事務已經提交也不會對另一個事務造成影響,直到使用新的事務。

4)SERIERLIZED(可串行化)

為方便解釋,假設表中已有一條數據

User A             User B

SET AUTOCOMMIT=0;

SET AUTOCOMMIT=0;

time

| ?      SELECT * FROM t;

| ?      返回1 row

| ?                      SELECT * FROM t;

|                       返回1 row

v

UPDATE此行;

被加鎖,等待

so:SERIERLIZED(可串行化)事務隔離級別最高,在進行查詢時就會對表或行加上共享鎖,其他事務對該表將只能進行讀操作,而不能進行寫操作。

(以上內容含網絡摘錄,如有侵犯,多多包涵)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534939.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534939.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534939.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

exe打包工具哪個最好_一鍵分發工具哪個最好用?這款30萬人都在用,很優秀!...

現代化媒體對于傳播越來越重要,16年到如今,視頻內容產業實在有話題度,其高效的粉絲互動機制、低資金投入高額回報等等亮點,強烈吸引著數以百萬計的創造者,為了達到極其出色的閱讀量,這些人往往會運用到所有…

mysql備份服務器中的_使用 Shell 備份遠程服務器上的 MySQL 數據庫到本機

適用場景:遠程服務器上的 MySQL 不允許遠程訪問,此時我們需要先登錄服務器,備份數據庫后,將備份文件拉取到本機。源碼 mysqlDumpRemote2Local.sh#!/bin/bash################################################# TODO: 登錄遠程服務…

date轉timestamp格式_技術分享 | MySQL:timestamp 時區轉換導致 CPU %sy 高的問題

作者:高鵬文章末尾有他著作的《深入理解 MySQL 主從原理 32 講》,深入透徹理解 MySQL 主從,GTID 相關技術知識。本文為學習記錄,可能有誤請諒解。本文建議PC端觀看,效果更佳。這個問題是一個朋友遇到的風云&#xff0c…

mysql架構組成_第 2 章 MySQL 架構組成

麻雀雖小,五臟俱全。MySQL 雖然以簡單著稱,但其內部結構并不簡單。本章從MySQL物理組成、邏輯組成,以及相關工具幾個角度來介紹 MySQL 的整體架構組成,希望能夠讓讀者對 MySQL 有一個更全面深入的了解。2.1 MySQL物理文…

python列表生成器語法_python列表生產式和生成器

1.列表生成式:通過簡潔的語法可以對一組元素進行過濾 格式:[exp for val in collection if condition] 例子1: a [x*xforxinxrange(1,10)ifx%20] print(a) 1)append(): 該方法用于在列表末尾添加新的對象,…

win2008 mysql端口_使用自定義端口連接SQL Server 2008的方法

使用過SQL Server的人大多都知道,SQL Server服務器默認監聽的端口號是1433,但是我今天遇到的問題是我的機器上有三個數據庫實例,這樣使用TCP/IP遠程連接時就產生了問題。如何在Microsoft SQL Server Management Studio里加入端口號連接呢&…

python基本命令range_Python的Range()函數(指南)

當需要執行特定次數的操作時,Python內置的range函數十分方便。 讀罷本文,你將: 理解Python的range函數是如何工作的 了解Python 2和Python 3中的實現方式有何不同 看過了不少range()函數操作實例 有能力解決它的一些局限性 讓我們開始吧&…

天涯python_python 網絡爬蟲(一)爬取天涯論壇評論

我是一個大二的學生,也是剛接觸python,接觸了爬蟲感覺爬蟲很有趣就爬了爬天涯論壇,中途碰到了很多問題,就想把這些問題分享出來,都是些簡單的問題,希望大佬們以寬容的眼光來看一個小菜鳥😄&…

python快遞費用計算_[Python]簡單用Python寫個查詢快遞的程序最后附源代碼

[Python] 純文本查看 復制代碼from requests_html import HTMLSession session HTMLSession() def sb(dh): 用來識別快遞 返回快遞種類! url http://www.kuaidi100.com/autonumber/autoComNum?resultv21&text dh header { Referer: http://www.kuaidi100.com/, User-A…

qos的_QoS 概述

QoS 是一個很大的領域,涉及到網絡中的多個層次和環節。本文僅簡要的談談 Endpoint 側的 QoS 概念,將這些紛繁的概念名詞串起來,便于理解。QoS 技術背景下圖說明了 QoS workflow 中,各項技術的位置和關系摘自 < 端到端Q…

為什么python 為什么沒有接口_python做接口測試的必要性

什么是接口測試 接口測試主要用于檢測外部系統與內部系統之間,以及系統內部各 個子系統之間的交互點。其測試的重點是,檢查數據的交換、傳遞和控 制管理過程,以及系統間的邏輯依賴關系等。 為什么要做接口測試 1.傳統的測試方法成本急劇增加&…

路由器mysql密碼重置密碼_【驗證】mysql root密碼恢復

1.首先確認服務器出于安全的狀態,也就是沒有人能夠任意地連接MySQL數據庫。因為在重新設置MySQL的root密碼的期間,MySQL數據庫完全出于沒有密碼保護的狀態下,其他的用戶也可以任意地登錄和修改MySQL的信息。可以采用將MySQL對外的…

centos daemonize_手把手教你在centos上配置Django項目(超詳細步驟)

前言關于Django的部署,本人也踩了很多坑,這篇文章一步一步教你怎么進行部署,只需要你按照我的步驟來就OK了!這里我們使用的服務器是一個全新的服務器,沒有安裝任何東西。基礎環境搭建步驟★ 注意:下面的步驟…

mysql8.0.17壓縮包安裝教程_mysql 8.0.16 壓縮包安裝配置方法圖文教程

本文為大家分享了mysql 8.0.16 壓縮包安裝配置方法,供大家參考,具體內容如下運行環境:windows 10 x641、下載zip安裝包:mysql8.0 for windows zip包:,進入頁面后可以不用登錄。后點擊底部“no thanks, just…