最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

簡述MySql四種事務(wù)隔離級別

 更新時(shí)間:2020年08月14日 11:27:43   作者:小諸葛  
這篇文章主要介紹了MySql四種隔離級別,幫助大家更好的理解和學(xué)習(xí)MySQL,感興趣的朋友可以了解下

隔離級別:

隔離性其實(shí)比想象的要復(fù)雜。 在SQL標(biāo)準(zhǔn)中定義了四種隔離級別, 每一個(gè)事務(wù)中所做的修改,哪些在事務(wù)內(nèi)和事務(wù)間是可見的,哪些是不可見的。較低級別的隔離通??梢詧?zhí)行更高的并發(fā),系統(tǒng)的開銷也更低。

下面簡單地介紹一下四種隔離級別。

1.READ UNCOMMITTED(未提交讀)

在 READ UNCOMMITTED級別, 事務(wù)中的修改, 即使沒有提交, 對其他事務(wù)也都是可見的。 事務(wù)可以讀取未提交的數(shù)據(jù), 這也被稱為臟讀 (Dirty Read). 這個(gè)級別會導(dǎo)致很多問題,從性能上來說, READ UNCOMMITTED 不會比其他的級別好太多, 但卻缺乏其他級別的很多好處, 除非真的有非常必要的理由, 在實(shí)際應(yīng)用中一般很少使用。

(1)所有事務(wù)都可以看到其他未提交事務(wù)的執(zhí)行結(jié)果

(2)本隔離級別很少用于實(shí)際應(yīng)用,因?yàn)樗男阅芤膊槐绕渌墑e好多少

(3)該級別引發(fā)的問題是——臟讀(Dirty Read):讀取到了未提交的數(shù)據(jù)

#首先,修改隔離級別
set tx_isolation='READ-UNCOMMITTED';
select @@tx_isolation;
+------------------+
| @@tx_isolation |
+------------------+
| READ-UNCOMMITTED |
+------------------+#事務(wù)A:啟動一個(gè)事務(wù)
start transaction;
select * from tx;
+------+------+
| id | num |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+------+------+#事務(wù)B:也啟動一個(gè)事務(wù)(那么兩個(gè)事務(wù)交叉了)
在事務(wù)B中執(zhí)行更新語句,且不提交
start transaction;
update tx set num=10 where id=1;
select * from tx;
+------+------+
| id | num |
+------+------+
| 1 | 10 |
| 2 | 2 |
| 3 | 3 |
+------+------+#事務(wù)A:那么這時(shí)候事務(wù)A能看到這個(gè)更新了的數(shù)據(jù)嗎?
select * from tx;
+------+------+
| id | num |
+------+------+
| 1 | 10 | --->可以看到!說明我們讀到了事務(wù)B還沒有提交的數(shù)據(jù)
| 2 | 2 |
| 3 | 3 |
+------+------+#事務(wù)B:事務(wù)B回滾,仍然未提交
rollback;
select * from tx;
+------+------+
| id | num |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+------+------+#事務(wù)A:在事務(wù)A里面看到的也是B沒有提交的數(shù)據(jù)
select * from tx;
+------+------+
| id | num |
+------+------+
| 1 | 1 |  --->臟讀意味著我在這個(gè)事務(wù)中(A中),事務(wù)B雖然沒有提交,但它任何一條數(shù)據(jù)變化,我都可以看到!
| 2 | 2 |
| 3 | 3 |
+------+------+

2.READ COMMITTED(提交讀)

大多數(shù)數(shù)據(jù)庫系統(tǒng)的默認(rèn)隔離級別都是READ COMMITTED,MySQL不是.READ COMMITTED滿足前面提到的隔離性的簡單定義:一個(gè)事務(wù)開始時(shí),只能“看見”已經(jīng)提交的事務(wù)所做的修改。 換句話說, 一個(gè)事務(wù)從開始直到提交之前, 所做的任何修改對其他事務(wù)都是不可見的。 這個(gè)級別有時(shí)候也叫做不可重復(fù)讀 (nonrepeatableread),因?yàn)閮纱螆?zhí)行同樣的查詢,可能會得到不一樣的結(jié)果。

(1)這是大多數(shù)數(shù)據(jù)庫系統(tǒng)的默認(rèn)隔離級別(但不是MySQL默認(rèn)的)

(2)它滿足了隔離的簡單定義:一個(gè)事務(wù)只能看見已經(jīng)提交事務(wù)所做的改變

(3)這種隔離級別出現(xiàn)的問題是——不可重復(fù)讀(Nonrepeatable Read):不可重復(fù)讀意味著我們在同一個(gè)事務(wù)中執(zhí)行完全相同的select語句時(shí)可能看到不一樣的結(jié)果。

導(dǎo)致這種情況的原因可能有:

(1)有一個(gè)交叉的事務(wù)有新的commit,導(dǎo)致了數(shù)據(jù)的改變;

(2)一個(gè)數(shù)據(jù)庫被多個(gè)實(shí)例操作時(shí),同一事務(wù)的其他實(shí)例在該實(shí)例處理其間可能會有新的commit

#首先修改隔離級別
set tx_isolation='read-committed';
select @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| READ-COMMITTED |
+----------------+#事務(wù)A:啟動一個(gè)事務(wù)
start transaction;
select * from tx;
+------+------+
| id | num |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+------+------+#事務(wù)B:也啟動一個(gè)事務(wù)(那么兩個(gè)事務(wù)交叉了)
在這事務(wù)中更新數(shù)據(jù),且未提交
start transaction;
update tx set num=10 where id=1;
select * from tx;
+------+------+
| id | num |
+------+------+
| 1 | 10 |
| 2 | 2 |
| 3 | 3 |
+------+------+#事務(wù)A:這個(gè)時(shí)候我們在事務(wù)A中能看到數(shù)據(jù)的變化嗎?
select * from tx; --------------->
+------+------+    |
| id | num |    |
+------+------+    |
| 1 | 1 |--->并不能看到! |
| 2 | 2 |    |
| 3 | 3 |    |
+------+------+    |——>相同的select語句,結(jié)果卻不一樣
|
#事務(wù)B:如果提交了事務(wù)B呢?   |
commit;      |
|
#事務(wù)A:       |
select * from tx; --------------->
+------+------+
| id | num |
+------+------+
| 1 | 10 |--->因?yàn)槭聞?wù)B已經(jīng)提交了,所以在A中我們看到了數(shù)據(jù)變化
| 2 | 2 |
| 3 | 3 |
+------+------+

3.REPEATABLE READ (可重復(fù)讀)

REPEATABLE READ解決了臟讀的問題。 該級別保證了在同一個(gè)事務(wù)中多次讀取同樣記錄的結(jié)果是一致的。 但是理論上, 可重復(fù)讀隔離級別還是無法解決另外一個(gè)幻讀(Phantom Read)的問題。所謂幻讀,指的是當(dāng)某個(gè)事務(wù)在讀取某個(gè)范圍內(nèi)的記錄時(shí),另外一個(gè)事務(wù)又在該范圍內(nèi)插人了新的記錄, 當(dāng)之前的事務(wù)再次讀取該范圍的記錄時(shí), 會產(chǎn)生幻行 (Phantom Row).InnoDB和XtraDB存儲引擎通過多版本并發(fā)控制 (MVCC, Multiversion Concurrency Control) 解決了幻讀的問題。

(1)這是MySQL的默認(rèn)事務(wù)隔離級別

(2)它確保同一事務(wù)的多個(gè)實(shí)例在并發(fā)讀取數(shù)據(jù)時(shí),會看到同樣的數(shù)據(jù)行

(3)此級別可能出現(xiàn)的問題——幻讀(Phantom Read):當(dāng)用戶讀取某一范圍的數(shù)據(jù)行時(shí),另一個(gè)事務(wù)又在該范圍內(nèi)插入了新行,當(dāng)用戶再讀取該范圍的數(shù)據(jù)行時(shí),會發(fā)現(xiàn)有新的幻影行

(4)InnoDB和Falcon存儲引擎通過多版本并發(fā)控制(MVCC,Multiversion Concurrency Control)機(jī)制解決了該問題

#首先,更改隔離級別
set tx_isolation='repeatable-read';
select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+#事務(wù)A:啟動一個(gè)事務(wù)
start transaction;
select * from tx;
+------+------+
| id | num |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+------+------+#事務(wù)B:開啟一個(gè)新事務(wù)(那么這兩個(gè)事務(wù)交叉了)
在事務(wù)B中更新數(shù)據(jù),并提交
start transaction;
update tx set num=10 where id=1;
select * from tx;
+------+------+
| id | num |
+------+------+
| 1 | 10 |
| 2 | 2 |
| 3 | 3 |
+------+------+
commit;#事務(wù)A:這時(shí)候即使事務(wù)B已經(jīng)提交了,但A能不能看到數(shù)據(jù)變化?
select * from tx;
+------+------+
| id | num |
+------+------+
| 1 | 1 | --->還是看不到的!(這個(gè)級別2不一樣,也說明級別3解決了不可重復(fù)讀問題)
| 2 | 2 |
| 3 | 3 |
+------+------+#事務(wù)A:只有當(dāng)事務(wù)A也提交了,它才能夠看到數(shù)據(jù)變化
commit;
select * from tx;
+------+------+
| id | num |
+------+------+
| 1 | 10 |
| 2 | 2 |
| 3 | 3 |
+------+------+

4.SERIALIZABLE(可串行化)

SERIALIZABLE是最高的隔離級別。它通過強(qiáng)制事務(wù)串行執(zhí)行,避免了前面說的幻讀的問題.簡單來說,SERIALIZABLE會在讀取的每一行數(shù)據(jù)上都加鎖,所以可能導(dǎo)致大量的超時(shí)和鎖爭用的問題。 實(shí)際應(yīng)用中也很少用到這個(gè)隔離級別,只有在非常需要確保數(shù)據(jù)的一致性而且可以接受沒有并發(fā)的情況下, 才考慮采用該級別。

(1)這是最高的隔離級別

(2)它通過強(qiáng)制事務(wù)排序,使之不可能相互沖突,從而解決幻讀問題。簡言之,它是在每個(gè)讀的數(shù)據(jù)行上加上共享鎖。

(3)在這個(gè)級別,可能導(dǎo)致大量的超時(shí)現(xiàn)象和鎖競爭

#首先修改隔離界別
set tx_isolation='serializable';
select @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| SERIALIZABLE |
+----------------+#事務(wù)A:開啟一個(gè)新事務(wù)
start transaction;#事務(wù)B:在A沒有commit之前,這個(gè)交叉事務(wù)是不能更改數(shù)據(jù)的
start transaction;
insert tx values('4','4');
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
update tx set num=10 where id=1;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

以上就是簡述MySql四種隔離級別的詳細(xì)內(nèi)容,更多關(guān)于MySQL 隔離級別的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Windows 64 位 mysql 5.7以上版本包解壓中沒有data目錄和my-default.ini及服務(wù)無法啟動的快速解決辦法(問題小結(jié))

    Windows 64 位 mysql 5.7以上版本包解壓中沒有data目錄和my-default.ini及服務(wù)無法啟動

    這篇文章主要介紹了Windows 64 位 mysql 5.7以上版本包解壓中沒有data目錄和my-default.ini及服務(wù)無法啟動的快速解決辦法(問題小結(jié)),需要的朋友可以參考下
    2018-03-03
  • Mysql?8.0?綠色版安裝教程詳解

    Mysql?8.0?綠色版安裝教程詳解

    這篇文章主要為大家詳細(xì)介紹了Mysql?8.0?綠色版安裝教程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • MySQL?使用觸發(fā)器記錄用戶的操作日志問題

    MySQL?使用觸發(fā)器記錄用戶的操作日志問題

    使用?MySQL?觸發(fā)器可以記錄哪些用戶、什么時(shí)間對數(shù)據(jù)表進(jìn)行了增、刪、改操作。如果執(zhí)行刪除操作,則記錄刪除之前的數(shù)據(jù)記錄;如果執(zhí)行更新操作,記錄更新之前的數(shù)據(jù)記錄,這篇文章主要介紹了MySQL?使用觸發(fā)器記錄用戶的操作日志,需要的朋友可以參考下
    2022-12-12
  • 淺談MySQL索引優(yōu)化分析

    淺談MySQL索引優(yōu)化分析

    這篇文章主要介紹了淺談MySQL索引優(yōu)化分析,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • mysql:ERROR?2003?(HY000)故障錯(cuò)誤解決方法與思路

    mysql:ERROR?2003?(HY000)故障錯(cuò)誤解決方法與思路

    這篇文章主要給大家介紹了關(guān)于mysql:ERROR?2003?(HY000)故障錯(cuò)誤解決方法與思路的相關(guān)資料,error 2003 hy000是MySQL數(shù)據(jù)庫中一個(gè)常見的錯(cuò)誤代碼,它通常意味著MySQL無法建立到數(shù)據(jù)庫的連接,需要的朋友可以參考下
    2024-02-02
  • 詳解MySQL數(shù)據(jù)類型DECIMAL(N,M)中N和M分別表示的含義

    詳解MySQL數(shù)據(jù)類型DECIMAL(N,M)中N和M分別表示的含義

    關(guān)于MySQL數(shù)據(jù)類型decimal中n和m分別表示什么含義?本文就此問題作了簡單論述,并創(chuàng)建相關(guān)表進(jìn)行驗(yàn)證,需要的朋友可以了解下。
    2017-10-10
  • MySQL臨時(shí)表的使用方法詳解

    MySQL臨時(shí)表的使用方法詳解

    在寫查詢時(shí)我們會經(jīng)常用到臨時(shí)表來存儲數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于MySQL臨時(shí)表的使用方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • MySQL復(fù)制問題的三個(gè)參數(shù)分析

    MySQL復(fù)制問題的三個(gè)參數(shù)分析

    這篇文章主要介紹了MySQL復(fù)制問題的三個(gè)參數(shù)分析,幫助大家更好的理解和學(xué)習(xí)使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2021-04-04
  • linux mysql5.5升級至mysql5.7的步驟與踩到的坑

    linux mysql5.5升級至mysql5.7的步驟與踩到的坑

    這篇文章主要介紹了linux mysql5.5升級至mysql5.7的詳細(xì)步驟,后面腳本之家小編為大家整理了多個(gè)補(bǔ)充,大家可以參考一下
    2021-01-01
  • MySql數(shù)據(jù)庫備份的幾種方式

    MySql數(shù)據(jù)庫備份的幾種方式

    這篇文章主要介紹了MySql數(shù)據(jù)庫備份的幾種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12

最新評論

鞍山市| 晋宁县| 灵宝市| 双辽市| 哈密市| 慈利县| 隆昌县| 寿阳县| 穆棱市| 门源| 额敏县| 大新县| 宾川县| 吉安市| 东港市| 永嘉县| 定远县| 合山市| 青冈县| 什邡市| 韩城市| 临桂县| 晋中市| 保山市| 德化县| 阳朔县| 札达县| 开远市| 凌源市| 双牌县| 怀安县| 苏州市| 台中县| 西华县| 甘肃省| 巩留县| 杭锦旗| 库伦旗| 金门县| 金坛市| 宁安市|