佳木斯湛栽影视文化发展公司

主頁 > 知識(shí)庫 > MySQL數(shù)據(jù)庫事務(wù)隔離級(jí)別詳解

MySQL數(shù)據(jù)庫事務(wù)隔離級(jí)別詳解

熱門標(biāo)簽:服務(wù)外包 地方門戶網(wǎng)站 Linux服務(wù)器 呼叫中心市場(chǎng)需求 AI電銷 鐵路電話系統(tǒng) 百度競(jìng)價(jià)排名 網(wǎng)站排名優(yōu)化

數(shù)據(jù)庫事務(wù)隔離級(jí)別

數(shù)據(jù)庫事務(wù)的隔離級(jí)別有4個(gè),由低到高依次為

  1. Read uncommitted:允許臟讀。
  2. Read committed: 防止臟讀,最常用的隔離級(jí)別,并且是大多數(shù)數(shù)據(jù)庫的默認(rèn)隔離級(jí)別。
  3. Repeatable read:可以防止臟讀和不可重復(fù)讀。
  4. Serializable:可以防止臟讀,不可重復(fù)讀取和幻讀,(事務(wù)串行化)會(huì)降低數(shù)據(jù)庫的效率。

這四個(gè)級(jí)別可以逐個(gè)解決臟讀 、不可重復(fù)讀 、幻讀 這幾類問題。

√: 可能出現(xiàn) ×: 不會(huì)出現(xiàn)

事務(wù)級(jí)別 臟讀 不可重復(fù)讀 幻讀
Read uncommitted
Read committed ×
Repeatable read × ×
Serializable × × ×

注意:我們討論隔離級(jí)別的場(chǎng)景,主要是在多個(gè)事務(wù)并發(fā)的情況下。

臟讀、幻讀、不可重復(fù)讀

臟讀:

臟讀就是指當(dāng)一個(gè)事務(wù)正在訪問數(shù)據(jù),并且對(duì)數(shù)據(jù)進(jìn)行了修改,而這種修改還沒有提交到數(shù)據(jù)庫中,這時(shí),另外一個(gè)事務(wù)也訪問這個(gè)數(shù)據(jù),然后使用了這個(gè)數(shù)據(jù)。

不可重復(fù)讀:

是指在一個(gè)事務(wù)內(nèi),多次讀同一數(shù)據(jù)。在這個(gè)事務(wù)還沒有結(jié)束時(shí),另外一個(gè)事務(wù)也訪問該同一數(shù)據(jù)。那么,在第一個(gè)事務(wù)中的兩次讀數(shù)據(jù)之間,由于第二個(gè)事務(wù)的修改,那么第一個(gè)事務(wù)兩次讀到的的數(shù)據(jù)可能是不一樣的。這樣就發(fā)生了在一個(gè)事務(wù)內(nèi)兩次讀到的數(shù)據(jù)是不一樣的,因此稱為是不可重復(fù)讀。(即不能讀到相同的數(shù)據(jù)內(nèi)容)

幻讀:

是指當(dāng)事務(wù)不是獨(dú)立執(zhí)行時(shí)發(fā)生的一種現(xiàn)象,例如第一個(gè)事務(wù)對(duì)一個(gè)表中的數(shù)據(jù)進(jìn)行了修改,這種修改涉及到表中的全部數(shù)據(jù)行。同時(shí),第二個(gè)事務(wù)也修改這個(gè)表中的數(shù)據(jù),這種修改是向表中插入一行新數(shù)據(jù)。那么,以后就會(huì)發(fā)生操作第一個(gè)事務(wù)的用戶發(fā)現(xiàn)表中還有沒有修改的數(shù)據(jù)行,就好象發(fā)生了幻覺一樣。

example:

表:

CREATE TABLE `cc_wsyw126_user_test_isolation_copy` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `password` varchar(64) NOT NULL,
 `age` int(11) NOT NULL,
 PRIMARY KEY (`id`),
 KEY `ix_age` (`age`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

模擬數(shù)據(jù):

INSERT INTO `cc_wsyw126_user_test_isolation_copy` (`password`, `age`) 
VALUES 
('1', 1),
('2', 2),
('3', 3),
('4', 4);

第一個(gè)事務(wù)A:

start transaction 
insert into cc_wsyw126_user_test_isolation_copy (password, age) values ('5',5)
commit

第二個(gè)事務(wù)B:

start transaction 
update cc_wsyw126_user_test_isolation_copy set age = 2 where password >='2'
select * from cc_wsyw126_user_test_isolation_copy where password >= '2';
commit

重現(xiàn)步驟:

只要A事務(wù)的insert語句,在B事務(wù)select之前和update之后即可。

MySQL InnoDB存儲(chǔ)引擎,實(shí)現(xiàn)的是基于多版本的并發(fā)控制協(xié)議——MVCC (Multi-Version Concurrency Control) 加上間隙鎖(next-key locking)策略在Repeatable Read (RR)隔離級(jí)別下不存在幻讀。如果測(cè)試幻讀,在MyISAM下實(shí)驗(yàn)。

在聚集索引(主鍵索引)中,如果有唯一性約束,InnoDB會(huì)將默認(rèn)的next-key lock降級(jí)為record lock。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

您可能感興趣的文章:
  • MySQL中Innodb的事務(wù)隔離級(jí)別和鎖的關(guān)系的講解教程
  • 關(guān)于Mysql隔離級(jí)別、鎖與MVCC介紹
  • mysql的事務(wù),隔離級(jí)別和鎖用法實(shí)例分析
  • 深入理解Mysql的四種隔離級(jí)別
  • MySQL 四種事務(wù)隔離級(jí)別詳解及對(duì)比
  • MySQL四種事務(wù)隔離級(jí)別詳解
  • Mysql事務(wù)隔離級(jí)別之讀提交詳解
  • MySQL隔離級(jí)別和鎖機(jī)制的深入講解

標(biāo)簽:衡水 蘭州 湘潭 仙桃 湖南 崇左 銅川 黃山

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL數(shù)據(jù)庫事務(wù)隔離級(jí)別詳解》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    黄冈市| 太康县| 盐津县| 大理市| 竹溪县| 福安市| 兴国县| 乌拉特前旗| 井冈山市| 泗阳县| 抚宁县| 盖州市| 霸州市| 高台县| 咸丰县| 将乐县| 都兰县| 绥芬河市| 威远县| 扬中市| 汕头市| 承德市| 禄丰县| 富民县| 蒙阴县| 宿州市| 磐石市| 土默特左旗| 双城市| 涿州市| 澳门| 赤壁市| 威信县| 靖边县| 柞水县| 通城县| 宣化县| 卢氏县| 秀山| 巢湖市| 渝北区|