主頁 > 資料庫 > 資料庫事務隔離級別

資料庫事務隔離級別

2023-06-10 08:41:52 資料庫

標準隔離級別

讀未提交、讀已提交、可重復讀、串行化

串行化

對事務中所有讀寫的資料加上讀鎖、寫鎖、范圍鎖,所以沖突的事務必須同步執行,
//console1
start transaction ;
select * from transaction_test where `key`=1;
update transaction_test set name='newTest' where `key`=1;
//console2
start transaction ;
select * from transaction_test where `key`=1;(由于事務1沒有釋放寫鎖,所以這里的查詢會阻塞
如果等待時間過長,會報如下的錯誤;如果事務1只是查詢,那么事務2也可以查詢)
[40001][1205] Lock wait timeout exceeded; try restarting transaction
//console1
commit ;(提交完之后如果事務2沒有等待超時,那么會立即執行)
//console2;
commit ;

可重復讀

核心是只對事務中所有讀寫的資料加上讀鎖、寫鎖,不加范圍鎖, 相比于讀已提交,由于對整個事務都加上了讀鎖,避免其他事務可以進行更新,進而保證同一個事務多次讀到的資料都是沒有被修改過的資料,
----避免可重復讀----
name初始值為init
//console1
start transaction ;
select * from transaction_test where `key`=1;(查詢結果是init)
//console2
start transaction ;
update transaction_test set name='test' where `key`=1;
(理論上,由于事務1已經獲取了讀鎖,事務2這里添加寫鎖應該是添加不上的,應該是阻塞中才對;
但是,實操發現,執行成功了,且在事務2中通過下面這個陳述句查詢是test,這應該也是mvcc導致的
select * from transaction_test where `key`=1;
//console1
select * from transaction_test where `key`=1;
console1的第2次查詢,查詢結果和第一次一樣,還是init
另外,事務2都獲得寫鎖了,怎么能允許你事務1再去獲得讀鎖
commit ;
//console2
commit ;
相比于串行化,由于沒有加范圍鎖,會引發一種叫幻讀的情況 所謂幻讀是指在同一個事務中,第一次查詢id<10的假定有1條,第二次查詢可能會有2條,原因是在兩次查詢的中間,存在別的事務插入或者洗掉了資料,由于事務A只加了讀鎖或者寫鎖,只能防止其他事務對已經加鎖的這幾條資料進行修改,但避免不了插入和洗掉,所以才會出現這個問題,
----幻讀----
初始是1,name
//console1
start transaction ;
select * from transaction_test where `key`<10;
//console2
start transaction ;
insert into transaction_test ( `key`,`name`) value (3,'newddd');
select * from transaction_test where `key`<10;
commit;
//console1
select * from transaction_test where `key`<10;
理論上來講,這個地方應該會查到三條,但是實操發現,在事務2添加并提交之后,事務1查到了依然是原來的樣子
commit ;
select * from transaction_test where `key`<10;(提交之后再次查詢就有新結果了)

讀已提交

核心是對事務中需要更新的操作行加寫鎖,直到事務結束,但對查詢的操作行加讀鎖,但在查詢完之后立即釋放,即不是在整個事務范圍鎖定, 讀已提交通過對查詢操作加鎖來避免讀未提交,在事務B修改資料時因為其在事務結束之前一直持有寫鎖,事務A無法對資料加讀鎖,只能等待事務B提交事務才可以讀取,這也是讀已提交的名稱的由來, 雖然解決了讀未提交的問題,但是由于只在查詢的時候短暫加了寫鎖,引發了另一個不可重復讀的問題; 所謂不可重復讀是指在同一個事務中,對于同樣一條資料的兩次查詢結果不一樣,那么這個和幻讀有什么區別呢?幻讀整個事務中都存在讀鎖或者寫鎖,其他事務無法修改,只能增刪;但是不可重復讀,則是指當前已經查到的結果被更新了, 原因是假如同一個事務兩次查詢中間,別的事務進行了修改,由于事務A沒有加整個事務范圍的讀鎖,所以事務B是可以成功獲取寫鎖的,進而修改資料,最終導致了不可重復讀,
---避免讀未提交----
name初始值是init
//console1
start transaction ;
select * from transaction_test where `key`=1;
update transaction_test set name='test' where `key`=1;
//console2
start transaction ;
select * from transaction_test where `key`=1;(由于讀不到未提交的,所以肯定獲取不到修改后的test值,理論上只能等待事務1結束)
這個地方由于事務1已經添加了寫鎖,原則上事務2根本查詢不了,應該阻塞,就像串行化那里一樣
但是實際結果卻是可以查到以前的值,即init;所以這里應該是mvcc的作用
在讀已提交的級別下,mvcc機制總是取最新的版本即可,即最近被 Commit 的那個版本的資料記錄,
這樣保證了讀到的都是已提交的事務,且保留了幻讀問題
最新版本的快照讀,不是當前讀
//console1
commit;//提交之后,事務2再次查詢,發現已經可以獲取到改動后的值了,即test

---不可重復讀----
name初始值是init
//console1
start transaction ;
select * from transaction_test where `key`=1;(第一次查詢是init)
//console2
start transaction ;
update transaction_test set name='test' where `key`=1;(在事務2中更新并提交)
commit ;
//console1
select * from transaction_test where `key`=1;(第二次查詢是test)
commit ;

讀未提交

核心是對事務中需要更新的操作行加寫鎖,直到事務結束,但對查詢的操作行不加鎖, 引發的問題是臟讀,其實就是讀到了其他事務還沒有提交的資料;那么為什么事務A可以讀到事務B還沒有提交的資料? 分為兩步理解: 1.為什么存在可以讀的新的資料? 核心原因應該是write-ahead logging的設計,即上一章提到的允許在事務提交之前提前寫入資料,理論上肯定是寫到了記憶體中,并且記錄到undolog里面,雖然還不太情況事務的提交真正干了什么操作,但目前來,在記憶體是可以讀到已經修改好的資料, 2.為什么可以讀到已經加了寫鎖的資料 原因是讀未提交讀取資料是不加讀鎖的,而寫鎖只能防止其他事物不能加讀鎖和寫鎖,而不能防止沒有鎖 也可以看一下這篇博客的解釋
show variables like 'transaction%';
set global transaction isolation level read uncommitted ;//設定完之后要重新登錄
CREATE TABLE `transaction_test` (
`key` int(11),
`name` varchar(10) DEFAULT NULL
) ENGINE=InnoDB;
---read uncommitted---
讀未提交
//console1
start transaction ;
insert into transaction_test value (1,'test');
//console2
start transaction ;
select * from transaction_test where `key`=1; (查詢結果為1,test)
//console1
commit ;
//console2
commit;

兩個事務都是寫事務,晚開啟的事務更新會阻塞
//console1
start transaction ;
update transaction_test set name='newTest' where `key`=1;
//console2
start transaction ;
update transaction_test set name='Test' where `key`=1;(會阻塞,一直在執行中)
//console1
commit ;(在事務1提交成功后,事務2的更新立馬就成功了)
//console2
commit;

參考資料:

12 | 本地事務如何實作隔離性?-極客時間 03 | 事務隔離:為什么你改了我還看不見?-極客時間 讀未提交-為什么事務沒提交就可以讀到別人修改的資料 - 秦一居 - 博客園  

本文來自博客園,作者:起司啊,轉載請注明原文鏈接:https://www.cnblogs.com/qisi/p/transaction_isolation_level.html

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/554830.html

標籤:MySQL

上一篇:分布式資料庫 Join 查詢設計與實作淺析

下一篇:返回列表

標籤雲
其他(160737) Python(38219) JavaScript(25491) Java(18216) C(15237) 區塊鏈(8270) C#(7972) AI(7469) 爪哇(7425) MySQL(7244) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4589) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2435) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1984) 功能(1967) HtmlCss(1957) Web開發(1951) C++(1933) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1880) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • 資料庫事務隔離級別

    標準隔離級別 讀未提交、讀已提交、可重復讀、串行化 串行化 對事務中所有讀寫的資料加上讀鎖、寫鎖、范圍鎖。所以沖突的事務必須同步執行。 //console1 start transaction ; select * from transaction_test where `key`=1; updat ......

    uj5u.com 2023-06-10 08:41:52 more
  • 分布式資料庫 Join 查詢設計與實作淺析

    本文記錄 Mysql 分庫分表 和 Elasticsearch Join 查詢的實作思路,了解分布式場景資料處理的設計方案。文章從常用的關系型資料庫 MySQL 的分庫分表Join 分析,再到非關系型 ElasticSearch 來分析 Join 實作策略。逐步深入Join 的實作機制。 ......

    uj5u.com 2023-06-10 08:41:47 more
  • openEuler22+GreatSQL+dbops玩轉MGR

    > 芬達,《芬達的資料庫學習筆記》公眾號作者,開源愛好者,擅長 MySQL、ansible。 ## 背景 ### openEuler 是什么 openEuler22.03 LTS 是 openEuler 社區于 2022 年 3 月發布的開源作業系統(從系統版本的命名不難發現吧)。openEuler ......

    uj5u.com 2023-06-10 08:41:40 more
  • Hive執行計劃之什么是hiveSQL向量化模式及優化詳解

    Hive開啟向量化模式也是hiveSQL優化方法中的一種,可以提升hive查詢速率,也叫hive矢量化。 問題1:那么什么是hive向量化模式呢? 問題2:hive向量化什么情況下可以被使用,或者說它有哪些使用場景呢? 問題3:如何查看hive向量化使用的相關資訊? ## 1.什么是hive向量化模 ......

    uj5u.com 2023-06-10 08:41:25 more
  • Kafka關鍵原理

    # 日志分段切分條件 日志分段檔案切分包含以下4個條件,滿足其一即可: 1. 當前日志分段檔案的大小超過了broker端引數 `log.segment.bytes` 配置的值。`log.segment.bytes`引數的默認值為 `1073741824`,即1GB 2. 當前日志分段中訊息的最小時間 ......

    uj5u.com 2023-06-10 08:41:16 more
  • es索引資料復制并增加條件和修改目標資料值

    es操作同一個索引里資料的復制語法 復制資料: POST _reindex { "source": { "index": "source_index" }, "dest": { "index": "destination_index" } } 欄位值修改: POST source_index/_up ......

    uj5u.com 2023-06-10 08:41:08 more
  • Hadoop的完全分布式搭建

    ## 集群規劃 | 主機名 | Hadoop10 | Hadoop11 | Hadoop12 | | | | | | | 網路 | 192.168.10.10 | 192.168.10.11 | 192.168.10.12 | | 用戶 | hadooproot | hadooproot | had ......

    uj5u.com 2023-06-10 08:41:01 more
  • Oracle的PDB資料庫創建DIRECTORY時遇到ORA-65254

    在Oracle 19c多租戶環境的PDB資料庫下面創建一個DIRECTORY時,遇到了“ORA-65254: invalid path specified for the directory”,下面簡單演示一下所遇到的這個案例 SQL> CREATE PLUGGABLE DATABASE PDB6  ......

    uj5u.com 2023-06-09 08:47:19 more
  • Oracle的PDB資料庫創建DIRECTORY時遇到ORA-65254

    在Oracle 19c多租戶環境的PDB資料庫下面創建一個DIRECTORY時,遇到了“ORA-65254: invalid path specified for the directory”,下面簡單演示一下所遇到的這個案例 SQL> CREATE PLUGGABLE DATABASE PDB6  ......

    uj5u.com 2023-06-09 08:46:43 more
  • 手記系列之六 ----- 分享個人使用kafka經驗

    ## 前言 本篇文章主要介紹的關于本人從剛作業到現在使用kafka的經驗,內容非常多,包含了kafka的常用命令,在生產環境中遇到的一些場景處理,kafka的一些web工具推薦等等。由于kafka這塊的記錄以及經驗是從我剛開始使用kafka,從2017年開始,可能里面有些內容過時,請見諒。溫馨提醒, ......

    uj5u.com 2023-06-09 08:23:58 more