mysql 隔离级别 知乎_TiDB 事务隔离级别
TiDB 事務(wù)隔離級(jí)別
事務(wù)隔離級(jí)別是數(shù)據(jù)庫事務(wù)處理的基礎(chǔ),ACID 中的 “I”,即 Isolation,指的就是事務(wù)的隔離性。
SQL-92 標(biāo)準(zhǔn)定義了 4 種隔離級(jí)別:讀未提交 (READ UNCOMMITTED)、讀已提交 (READ COMMITTED)、可重復(fù)讀 (REPEATABLE READ)、串行化 (SERIALIZABLE)。詳見下表:Isolation LevelDirty WriteDirty ReadFuzzy ReadPhantomREAD UNCOMMITTEDNot PossiblePossiblePossiblePossible
READ COMMITTEDNot PossibleNot possiblePossiblePossible
REPEATABLE READNot PossibleNot possibleNot possiblePossible
SERIALIZABLENot PossibleNot possibleNot possibleNot possible
TiDB 實(shí)現(xiàn)了快照隔離 (Snapshot Isolation, SI) 級(jí)別的一致性。為與 MySQL 保持一致,又稱其為“可重復(fù)讀”。該隔離級(jí)別不同于 ANSI 可重復(fù)讀隔離級(jí)別和 MySQL 可重復(fù)讀隔離級(jí)別。注意:
在 TiDB v3.0 中,事務(wù)的自動(dòng)重試功能默認(rèn)為禁用狀態(tài)。不建議開啟自動(dòng)重試功能,因?yàn)榭赡軐?dǎo)致事務(wù)隔離級(jí)別遭到破壞。更多關(guān)于事務(wù)自動(dòng)重試的文檔說明,請(qǐng)參考事務(wù)重試。
從 TiDB v3.0.8 版本開始,新創(chuàng)建的 TiDB 集群會(huì)默認(rèn)使用悲觀事務(wù)模式,悲觀事務(wù)中的當(dāng)前讀(for update 讀)為不可重復(fù)讀,關(guān)于悲觀事務(wù)使用注意事項(xiàng),請(qǐng)參考悲觀事務(wù)模式
可重復(fù)讀隔離級(jí)別 (Repeatable Read)
當(dāng)事務(wù)隔離級(jí)別為可重復(fù)讀時(shí),只能讀到該事務(wù)啟動(dòng)時(shí)已經(jīng)提交的其他事務(wù)修改的數(shù)據(jù),未提交的數(shù)據(jù)或在事務(wù)啟動(dòng)后其他事務(wù)提交的數(shù)據(jù)是不可見的。對(duì)于本事務(wù)而言,事務(wù)語句可以看到之前的語句做出的修改。
對(duì)于運(yùn)行于不同節(jié)點(diǎn)的事務(wù)而言,不同事務(wù)啟動(dòng)和提交的順序取決于從 PD 獲取時(shí)間戳的順序。
處于可重復(fù)讀隔離級(jí)別的事務(wù)不能并發(fā)的更新同一行,當(dāng)事務(wù)提交時(shí)發(fā)現(xiàn)該行在該事務(wù)啟動(dòng)后,已經(jīng)被另一個(gè)已提交的事務(wù)更新過,那么該事務(wù)會(huì)回滾。示例如下:
create table t1(id int);
insert into t1 values(0);
start transaction; | start transaction;
select * from t1; | select * from t1;
update t1 set id=id+1; | update t1 set id=id+1; -- 如果使用悲觀事務(wù),則后一個(gè)執(zhí)行的 update 語句會(huì)等鎖,直到持有鎖的事務(wù)提交或者回滾釋放行鎖。
commit; |
| commit; -- 事務(wù)提交失敗,回滾。如果使用悲觀事務(wù),可以提交成功。
與 ANSI 可重復(fù)讀隔離級(jí)別的區(qū)別
盡管名稱是可重復(fù)讀隔離級(jí)別,但是 TiDB 中可重復(fù)讀隔離級(jí)別和 ANSI 可重復(fù)隔離級(jí)別是不同的。按照 A Critique of ANSI SQL Isolation Levels 論文中的標(biāo)準(zhǔn),TiDB 實(shí)現(xiàn)的是論文中的快照隔離級(jí)別。該隔離級(jí)別不會(huì)出現(xiàn)狹義上的幻讀 (A3),但不會(huì)阻止廣義上的幻讀 (P3),同時(shí),SI 還會(huì)出現(xiàn)寫偏斜,而 ANSI 可重復(fù)讀隔離級(jí)別不會(huì)出現(xiàn)寫偏斜,會(huì)出現(xiàn)幻讀。
與 MySQL 可重復(fù)讀隔離級(jí)別的區(qū)別
MySQL 可重復(fù)讀隔離級(jí)別在更新時(shí)并不檢驗(yàn)當(dāng)前版本是否可見,也就是說,即使該行在事務(wù)啟動(dòng)后被更新過,同樣可以繼續(xù)更新。這種情況在 TiDB 會(huì)導(dǎo)致事務(wù)回滾,導(dǎo)致事務(wù)最終失敗,而 MySQL 是可以更新成功的。MySQL 的可重復(fù)讀隔離級(jí)別并非 Snapshot 隔離級(jí)別,MySQL 可重復(fù)讀隔離級(jí)別的一致性要弱于 Snapshot 隔離級(jí)別,也弱于 TiDB 的可重復(fù)讀隔離級(jí)別。
讀已提交隔離級(jí)別 (Read Committed)
從 TiDB v4.0.0-beta 版本開始,TiDB 支持使用 Read Committed 隔離級(jí)別。由于歷史原因,當(dāng)前主流數(shù)據(jù)庫的 Read Committed 隔離級(jí)別本質(zhì)上都是 Oracle 定義的一致性讀隔離級(jí)別。TiDB 為了適應(yīng)這一歷史原因,悲觀事務(wù)中的 Read Committed 隔離級(jí)別的實(shí)質(zhì)行為也是一致性讀。注意:
Read Committed 隔離級(jí)別僅在悲觀事務(wù)模式下生效。在樂觀事務(wù)模式下設(shè)置事務(wù)隔離級(jí)別為 Read Committed 將不會(huì)生效,事務(wù)將仍舊使用可重復(fù)讀隔離級(jí)別。
與 MySQL Read Committed 隔離級(jí)別的區(qū)別
MySQL 的 Read Committed 隔離級(jí)別大部分符合一致性讀特性,但其中存在某些特例,如半一致性讀 (semi-consistent read),TiDB 沒有兼容這個(gè)特殊行為。
更多閱讀
總結(jié)
以上是生活随笔為你收集整理的mysql 隔离级别 知乎_TiDB 事务隔离级别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java圆饼图插件_饼图----插件
- 下一篇: java 获取spring对象数组_解析