国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

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

2024-07-24 13:12:31
字體:
供稿:網(wǎng)友

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

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

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

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

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

 

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

 

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

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

臟讀:

臟讀就是指當(dāng)一個(gè)事務(wù)正在訪問數(shù)據(jù),并且對數(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ù)對一個(gè)表中的數(shù)據(jù)進(jìn)行了修改,這種修改涉及到表中的全部數(shù)據(jù)行。同時(shí),第二個(gè)事務(wù)也修改這個(gè)表中的數(shù)據(jù),這種修改是向表中插入一行新數(shù)據(jù)。那么,以后就會發(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存儲引擎,實(shí)現(xiàn)的是基于多版本的并發(fā)控制協(xié)議——MVCC (Multi-Version Concurrency Control) 加上間隙鎖(next-key locking)策略在Repeatable Read (RR)隔離級別下不存在幻讀。如果測試幻讀,在MyISAM下實(shí)驗(yàn)。

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

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


注:相關(guān)教程知識閱讀請移步到MYSQL教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 轮台县| 三亚市| 江西省| 璧山县| 吉林市| 隆德县| 昌乐县| 唐河县| 徐水县| 华容县| 罗甸县| 井研县| 五寨县| 栾城县| 洪泽县| 嘉义县| 呈贡县| 莒南县| 德州市| 百色市| 巴青县| 突泉县| 夏津县| 武定县| 新乡市| 永平县| 昭苏县| 涿州市| 丹阳市| 阳春市| 竹北市| 绥芬河市| 汕头市| 封开县| 石棉县| 盐山县| 浪卡子县| 丰县| 龙游县| 行唐县| 高清|