成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為什么MySQL默認(rèn)使用RR隔離級(jí)別?

數(shù)據(jù)庫 MySQL
我們現(xiàn)在明白了為什么MySQL選擇Repeatable Read作為默認(rèn)的數(shù)據(jù)庫隔離級(jí)別了,實(shí)際上是為了與歷史上那種statement格式的binlog保持兼容性。

對(duì)于數(shù)據(jù)庫的默認(rèn)隔離級(jí)別,Oracle默認(rèn)的隔離級(jí)別是 RC,而MySQL默認(rèn)的隔離級(jí)別是 RR。

那么,你知道為什么Oracle選擇RC作為默認(rèn)級(jí)別,而MySQL要選擇RR作為默認(rèn)的隔離級(jí)別嗎?

Oracle的隔離級(jí)別

Oracle支持ANSI/ISO SQL定義的Serializable和Read Committed兩種隔離級(jí)別,根據(jù)Oracle官方文檔的介紹,Oracle的隔離級(jí)別包括Read Committed、Serializable和Read-Only。

圖片圖片

Read-Only的隔離級(jí)別類似于Serializable,然而僅允許只讀事務(wù)進(jìn)行數(shù)據(jù)檢索,不允許在事務(wù)中修改數(shù)據(jù),除非使用者是SYS用戶。

在Oracle的這三種隔離級(jí)別中,顯而易見,Serializable和Read-Only都不適合作為默認(rèn)隔離級(jí)別,因此唯一的選擇就是Read Committed了。

MySQL的隔離級(jí)別

與Oracle相比,MySQL提供的默認(rèn)隔離級(jí)別范圍更加廣泛。

首先,我們排除了Serializable和Read Uncommitted這兩種級(jí)別,原因是一個(gè)隔離級(jí)別過高會(huì)影響并發(fā)度,另一個(gè)過低則存在臟讀問題。

剩下的RR和RC兩種,如何選擇呢?

MySQL在設(shè)計(jì)之初就旨在提供一個(gè)穩(wěn)定的關(guān)系型數(shù)據(jù)庫。為解決MySQL單點(diǎn)故障問題,MySQL采取了主從復(fù)制機(jī)制。

所謂的主從復(fù)制,即通過建立MySQL集群,以整體向外提供服務(wù)。集群內(nèi)的機(jī)器分為主服務(wù)器(Master)和從服務(wù)器(Slave),主服務(wù)器負(fù)責(zé)提供寫服務(wù),而從服務(wù)器則提供讀服務(wù)。

在MySQL主從復(fù)制過程中,數(shù)據(jù)的同步通過binlog進(jìn)行。簡單來說,主服務(wù)器將數(shù)據(jù)變更記錄到binlog中,然后將binlog同步傳輸給從服務(wù)器。從服務(wù)器接收到binlog后,將其中的數(shù)據(jù)恢復(fù)到自己的數(shù)據(jù)庫存儲(chǔ)中。

那么,binlog里記錄的究竟是什么內(nèi)容?它的格式又是怎樣的呢?

MySQL的binlog主要支持三種格式,即statement、row和mixed。MySQL從5.1.5版本開始支持row格式,在5.1.8版本中開始支持mixed格式。

statement和row之間最重要的區(qū)別在于,當(dāng)binlog的格式為statement時(shí),binlog記錄的是SQL語句的原文。

由于MySQL早期僅支持statement這一種binlog格式,因此在使用提交讀(Read Committed)和未提交讀(Read Uncommitted)這兩種隔離級(jí)別時(shí)都可能會(huì)出現(xiàn)問題。

舉個(gè)例子,有一個(gè)數(shù)據(jù)庫表t1,表中有如下兩條記錄:

CREATE TABLE `t1` (
  `a` int(11) DEFAULT NULL,
  `b` int(11) DEFAULT NULL,
  KEY `b` (`b`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

insert into t1 values(10,1);

接著開始執(zhí)行兩個(gè)事務(wù)的寫操作:

Session 1

Session 2

set session transaction isolation level read committed;


set autocommit = 0;

set session transaction isolation level read committed;

begin;

begin;

delete from t1 where b < 100;



insert into t1 values(10,99);


commit;

commit;


以上兩個(gè)事務(wù)執(zhí)行之后,數(shù)據(jù)庫里面的記錄會(huì)只有一條記錄(10,99),這個(gè)發(fā)生在主庫的數(shù)據(jù)變更大家都能理解。

即使 Session 1 的刪除操作在 Session 2 的插入操作之后提交,由于 READ COMMITTED 的隔離級(jí)別,Session 2 的插入操作不會(huì)看到 Session 1 的刪除操作,所以最后數(shù)據(jù)庫中仍然會(huì)留下 Session 2 插入的記錄 (10,99)。

這種行為是 READ COMMITTED 隔禽級(jí)別的一種特性,它會(huì)在事務(wù)開始時(shí)創(chuàng)建一個(gè)快照。確保事務(wù)之間的隔離性,避免了數(shù)據(jù)不一致性的問題。

以上兩個(gè)事務(wù)執(zhí)行之后,會(huì)在bin log中記錄兩條記錄,因?yàn)槭聞?wù)2先提交,所以insert into t1 values(10,99);會(huì)被優(yōu)先記錄,然后再記錄delete from t1 where b < 100;(再次提醒:statement格式的bin log記錄的是SQL語句的原文)

這樣bin log同步到備庫之后,SQL語句回放時(shí),會(huì)先執(zhí)行insert into t1 values(10,99);,再執(zhí)行delete from t1 where b < 100;。

這時(shí)候,數(shù)據(jù)庫中的數(shù)據(jù)就會(huì)變成 EMPTY SET,即沒有任何數(shù)據(jù)。這就導(dǎo)致主庫和備庫的數(shù)據(jù)不一致了!!!

為了解決這種問題,MySQL將數(shù)據(jù)庫的默認(rèn)隔離級(jí)別設(shè)置為Repeatable Read。在Repeatable Read隔離級(jí)別下,針對(duì)更新數(shù)據(jù)時(shí)會(huì)不僅對(duì)更新的行加行級(jí)鎖,還會(huì)增加GAP鎖和next-key鎖。在上述例子中,當(dāng)事務(wù) 2 執(zhí)行時(shí),由于事務(wù) 1 添加了GAP鎖和next-key鎖,這將導(dǎo)致事務(wù) 2 執(zhí)行被阻塞,需要等待事務(wù) 1 提交或回滾后才能繼續(xù)執(zhí)行。

除了設(shè)置默認(rèn)的隔離級(jí)別外,MySQL還禁止在使用statement格式的binlog的情況下,將事務(wù)隔離級(jí)別設(shè)置為READ COMMITTED。

一旦用戶主動(dòng)修改隔離級(jí)別,嘗試更新時(shí),會(huì)報(bào)錯(cuò):

ERROR 1598 (HY000): Binary logging not possible. Message: Transaction level 'READ-COMMITTED' in InnoDB is not safe for binlog mode 'STATEMENT'

因此,我們現(xiàn)在明白了為什么MySQL選擇Repeatable Read作為默認(rèn)的數(shù)據(jù)庫隔離級(jí)別了,實(shí)際上是為了與歷史上那種statement格式的binlog保持兼容性。

責(zé)任編輯:武曉燕 來源: 碼上遇見你
相關(guān)推薦

2021-12-10 11:45:49

MySQLRRRC

2024-07-16 08:19:46

MySQL數(shù)據(jù)InnoDB

2021-06-17 09:16:34

MySQL數(shù)據(jù)庫隔離級(jí)別

2022-09-08 08:02:26

MySQL隔離

2021-06-11 16:59:41

MySQLRepeatableRead

2021-08-26 06:58:15

Innodb RR隔離級(jí)別

2018-12-19 16:46:38

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

2021-07-26 10:28:13

MySQL事務(wù)隔離

2024-04-26 09:17:20

MySQL事務(wù)隔離

2021-08-04 13:19:42

MySQL 事務(wù)隔離

2022-06-10 11:51:49

MySQL事務(wù)隔離

2024-12-02 08:37:04

2021-10-19 10:10:51

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

2022-07-26 07:14:20

線程隔離Thread

2010-11-19 16:13:06

oracle事務(wù)隔離級(jí)

2024-06-26 00:43:54

MySQL測試TOTAL?

2025-03-03 08:20:00

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

2009-06-29 17:54:47

Spring事務(wù)隔離

2025-01-13 13:12:54

2020-10-13 10:32:24

MySQL事務(wù)MVCC
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 综合久久综合久久 | 影音先锋成人资源 | 免费亚洲一区二区 | 中文字幕日韩在线 | 欧美在线亚洲 | 国产伦精品一区二区三区高清 | 国产日韩久久 | 国产成人精品免费 | 91在线视频观看免费 | www.久草.com | 在线欧美亚洲 | 国产一区二区三区四区三区四 | 91网站在线看 | 一区二区三区四区视频 | 日本五月婷婷 | 99精品国产一区二区三区 | 天天操综合网站 | 亚洲免费在线 | 国产在线麻豆精品入口 | 羞羞视频网页 | 精品www | 国产精品永久久久久久久www | 精品日本久久久久久久久久 | 天天干天天爽 | av手机在线 | 成人精品一区亚洲午夜久久久 | 国产午夜在线观看 | 亚洲欧美一区二区三区在线 | 精品欧美乱码久久久久久1区2区 | 欧美日韩精品一区二区三区四区 | 免费的色网站 | 超碰人人在线 | 亚洲综合无码一区二区 | 国内自拍偷拍一区 | 成年网站在线观看 | 午夜国产羞羞视频免费网站 | 中文字幕精品一区二区三区精品 | 国产一区二区不卡 | 成人一区二区三区 | 成人三级网址 | 伊人精品久久久久77777 |