MySQL的事務與隔離級別

1.?什么是事務?

數據庫中的事務是指對數據庫執行一批操作,而這些操作最終要么全部執行成功,要么全部失敗,不會存在部分成功的情況。這個時候就需要用到事務。

最經典的例子就是轉賬,你要給朋友小白轉 1000 塊錢,而此時你的銀行卡只有 1000 塊錢。

轉賬過程具體到程序里會有一系列的操作,比如查詢余額、做加減法、更新余額等,這些操作必須保證是一體的,不然等程序查完之后,還沒做減法之前,你這 1000 塊錢,完全可以借著這個時間差再查一次,然后再給另外一個朋友轉賬,如果銀行這么整,不就亂了么?這時就要用到“事務”這個概念了。

簡單來說,事務就是要保證一組數據庫操作,要么全部成功,要么全部失敗

2.事務的幾個特性(ACID)

ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔離性、持久性)。

原子性(Atomicity)

事務的整個過程如原子操作一樣,最終要么全部成功,或者全部失敗,這個原子性是從最終結果來看的,從最終結果來看這個過程是不可分割的。

一致性(Consistency)
一個事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態。

所謂一致性,指的是數據處于一種有意義的狀態,這種狀態是語義上的而不是語法上的。最常見的例子是轉帳。例如從帳戶A轉一筆錢到帳戶B上,如果帳戶A上的錢減少了,而帳戶B上的錢卻沒有增加,那么我們認為此時數據處于不一致的狀態。

隔離性(Isolation)
一個事務的執行不能被其他事務干擾。即一個事務內部的操作及使用的數據對并發的其他事務是隔離的,并發執行的各個事務之間不能互相干擾。

持久性(Durability)
一個事務一旦提交,他對數據庫中數據的改變就應該是永久性的。當事務提交之后,數據會持久化到硬盤,修改是永久性的。

3.如何開啟事務

?事務分為隱式事務顯式事務。

隱式事務

mysql中事務默認是隱式事務,執行insert、update、delete操作的時候,數據庫自動開啟事務、提交或回滾事務。

是否開啟隱式事務是由變量autocommit控制的。

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.01 sec)--autocommit為ON表示開啟了自動提交

顯式事務

  1. 顯式啟動事務語句, begin 或 start transaction。配套的提交語句是 commit,回滾語句是 rollback
  2. set autocommit=0,這個命令會將這個線程的自動提交關掉。意味著如果你只執行一個 select 語句,這個事務就啟動了,而且并不會自動提交。這個事務持續存在直到你主動執行 commit 或 rollback 語句,或者斷開連接。

?建議你總是使用 set autocommit=1, 通過顯式語句的方式來啟動事務。

mysql> begin;
Query OK, 0 rows affected (0.00 sec)mysql> update test set name='sss' where id=7;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> commit;
Query OK, 0 rows affected (0.01 sec)

4.隔離級別?

當數據庫上有多個事務同時執行的時候,就可能出現臟讀(dirty read)、不可重復讀(non-repeatable read)、幻讀(phantom read)的問題。

(1)臟讀:一個事務讀到另外一個事務沒有提交的數據

解釋:例如兩個并發的事務a和b,其中事務A查完數據庫中的一條記錄后,事務a繼續修改了一條記錄,此時事務A并未提交,此時并發事務b讀取了事務a修改的記錄,這就導致事務b讀取到事務a未提交的數據

(2)不可重復讀:一個事務先后讀取同一條記錄,但是兩次讀取的數據不同

解釋:例如兩個并發事務a和b,其中事務a讀取數據庫中的一條記錄后,事務b對數據庫的這條記錄進行修改后,提交事務b,此時事務a繼續讀取這條記錄,發現和上次讀取的數據不一樣

(3)幻讀:一個事務按照條件查詢數據,沒有對應的數據行,準備插入數據時,發現這行數據存在

解釋:例如兩個并發事務a和事務b,其中事務a讀取了id=1的數據時,發現沒有這條記錄,然后事務b插入id=1的數據,并且提交了事務b,此時事務a準備插入id=1的數據時發現已經存在這條數據,因為插入數據時報錯,顯示有這條記錄

不可重復讀,關注是其他事務修改數據并提交了事務,前后兩次讀取到的數據不一致的問題;幻讀是新插入的行或刪除行導致出現的問題

解決不可重復讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表。

為了解決這些問題,就有了“隔離級別”的概念。?

mysql中一共有4中隔離級別,其中可重復讀是默認級別

  • 讀未提交是指,一個事務還沒提交時,它做的變更就能被別的事務看到。
  • 讀提交是指,一個事務提交之后,它做的變更才會被其他事務看到。
  • 可重復讀是指,一個事務執行過程中看到的數據,總是跟這個事務在啟動時看到的數據是一致的。當然在可重復讀隔離級別下,未提交變更對其他事務也是不可見的。
  • 串行化,顧名思義是對于同一行記錄,“寫”會加“寫鎖”,“讀”會加“讀鎖”。當出現讀寫鎖沖突的時候,后訪問的事務必須等前一個事務執行完成,才能繼續執行。

?上面4中隔離級別越來越強,會導致數據庫的并發性也越來越低。

--查看隔離級別(兩條任一條都行,這是查詢當前會話的)
show variables like 'transaction_isolation';
select @@transaction_isolation;--查看全局隔離級別
SELECT @@GLOBAL.TRANSACTION_ISOLATION;--設置隔離級別
SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED |
READ COMMITTED | REPEATABLE READ | SERIALIZABLE }--MySQL的session和global一般使用在終端,用來對配置進行暫時設置,當數據庫服務重啟就會失效。session和global體現在新的設置生效的范圍。
--session:當前會話,也就是當前連接立即生效。
--global:全局,不包含當前連接,之后新獲取的連接都會生效。

5.隔離級別的演示

?每個隔離級別可能出現的問題如下?

?讀未提交級別

出現臟讀

?讀已提交級別

解決臟讀,出現不可重復讀問題。

步驟5更新數據后還未提交,到步驟6查看,數據沒有改變,說明讀已提交解決了臟讀問題。

而步驟6和步驟8查看的數據是不一致的,這個就出現了不可重復讀問題。(在同一個事務先后讀取同一條記錄,但是兩次讀取的數據不同)。

?可重復讀級別

解決不可重復讀問題,出現幻讀。

解決了不可重復讀問題,步驟3,6,8讀到的數據都是一致的。在步驟9提交后,步驟10讀到的數據就是更新后的數據。

出現幻讀。

步驟3查看是沒有id=7的行,步驟4中插入id=7的行(步驟4是隱性提交),步驟5中再次查看還是沒有。之后步驟7插入數據,出現錯誤。這就是出現了幻讀。幻讀是針對新插入的行的

步驟8提交后,步驟9中查看可以看到另一事務插入的id=7的數據了。

可串行化級別

解決所有問題,但也是性能最差的一個

步驟5中會一直被卡住,等到超時。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/719493.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/719493.shtml
英文地址,請注明出處:http://en.pswp.cn/news/719493.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一代傳奇宗慶后:把員工寵成上帝

作者:積溪 琥珀酒研社快評: 梅子真是哭了 一代傳奇就此隕落 咱們又少了一個良心企業家 2月25日10時30分 娃哈哈集團創始人、董事長宗慶后 在杭州逝世,享年79歲 在過去一個多月的病危期間 他的病房里最顯眼的 不是呼吸機、檢測儀 而…

智慧城市中的公共服務創新:讓城市生活更便捷

目錄 一、引言 二、智慧城市公共服務創新的實踐 1、智慧交通系統 2、智慧醫療服務 3、智慧教育系統 4、智慧能源管理 三、智慧城市公共服務創新的挑戰 四、智慧城市公共服務創新的前景 五、結論 一、引言 隨著信息技術的迅猛發展,智慧城市已成為現代城市發…

技術總結: PPT繪圖

目錄 寫在前面參考文檔技巧總結PPT中元素的連接立方體調整厚度調整圖形中的文本3D 圖片調整漸變中的顏色 寫在前面 能繪制好一個好看的示意圖非常重要, 在科研和工作中好的示意圖能精準表達出自己的想法, 減少溝通的成本, 可視化的呈現也可以加強自身對系統的理解, 時間很久后…

分分鐘搞定JSON解析

json 庫能夠解析字符串或文本中的 JSON 內容。 該庫將 JSON 解析為 Python 字典或列表,也能將 Python 字典或列表轉換為 JSON 字符串。 解析 JSON 如下的 JSON 格式的字符串: json_string {"first_name": "Guido", "last_na…

【Web】速談FastJson反序列化中TemplatesImpl的利用

目錄 簡要原理分析 exp 前文:【Web】關于FastJson反序列化開始前的那些前置知識 簡要原理分析 眾所周知TemplatesImpl的利用鏈是這樣的: TemplatesImpl#getOutputProperties() -> TemplatesImpl#newTransformer() -> TemplatesImpl#getTransl…

瑞芯微RK3588 C++部署Yolov8檢測和分割模型

最近這一個月在研究國產瑞芯微板子上部署yolov8的檢測和分割模型,踩了很多坑,記錄一下部署的過程和遇到的一些問題: 1 環境搭建 需要的環境和代碼主要包括: (1)rknn-toolkit2-1.5.2:工具鏈&am…

微服務day04-基于Feign的遠程調用

一.Feign的認識 是http客戶端,因為使用RestTemplate存在一些問題:代碼可讀性差,參數配置費事,不夠優雅… String url"http://userservice/user/"order.getUserId(); User userrestTemplate.getForObject(url,User.cla…

01.23 校招 實習 內推 面經

綠*泡*泡VX: neituijunsir 交流*裙 ,內推/實習/校招匯總表格 1、蔚來24屆實習招聘特輯 | 軟件&算法類(內推) 蔚來24屆實習招聘特輯 | 軟件&算法類(內推) 2、校招 | 普天科技2024校園招聘 校招…

初始計算機組成原理

1.初始計算機組成原理 本人相關文章:Linux之計算機概論 聲明:大部分圖片均來自網絡,侵刪 一個完整的計算機系統包括硬件子系統和軟件子系統兩大部分。 組成一臺計算機的物理設備的總稱叫做計算機硬件子系統,是看得見摸得著的實體,是計算機工…

華工的各類型PPT模板

華工的各類型PPT模板,包括原創的PPT及改良內容的PPT,適合科研/比賽/組會匯報等 前言各種畢業答辯夏令營答辯復試答辯獎學金答辯比賽/項目答辯組會匯報 前言 設計不易,排版不易,內容編排不易 待更新項目1 原創聲明:不經…

【論文閱讀】(2006)Dual-Optimal Inequalities for Stabilized Column Generation

文章目錄 摘要一、介紹二、對偶最優不等式(Dual-Optimal Inequalities)三、確定P的最優原始解四、二元切割下料問題4.1 約束聚合4.2 相等約束4.3 計算結果 五、切割下料問題5.1 計算結果 六、三元組的深度對偶最優不等式(Deep Dual-Optimal I…

C/C++ 乘積尾零問題(藍橋杯)

如下的10行數據,每行有10個整數,請你求出它們的乘積的末尾有多少個零? 5650,4542 3554 473 946 4114 3871 9073 90 4329 2758 7949 6113 5659 5245 7432 3051 4434 6704 3594 9937 1173 6866 3397 4759 7557 3070 2287 1453 9899…

代碼隨想錄算法訓練營第三十六天|435. 無重疊區間, 763.劃分字母區間, 56. 合并區間

435. 無重疊區間 - LeetCode 思路: 本題是一個去除重疊區間的問題, 首先按照區間的 end_point 排序, 從第二個區間開始, 如果第二個區間和第一個區間有交集, 就要移除第二個區間。 因為容易證明之后的區間區間如果和…

做測試還是測試開發,選職業要慎重!

【軟件測試面試突擊班】2024吃透軟件測試面試最全八股文攻略教程,一周學完讓你面試通過率提高90%!(自動化測試) 突然發現好像挺多人想投測開和測試的,很多人面試的時候也會被問到這幾個職位的區別,然后有測…

每日五道java面試題之mysql數據庫篇(三)

目錄: 第一題. 百萬級別或以上的數據如何刪除?第二題. 前綴索引第三題. 什么是最左前綴原則?什么是最左匹配原則?第四題. B樹和B樹的區別第五題. 使用B樹和B樹好處 第一題. 百萬級別或以上的數據如何刪除? 關于索引:…

【設計】設計一個web版的數據庫管理平臺后端精要

需求 springboot設計開發一個系統,在這個系統的數據庫表中存放著2000個數據庫實例,有MySQL、Oracle、sql server3種數據庫類型,用戶可以在頁面上選擇不同的實例,連接這些實例上的數據庫,來執行業務sql 實現 Service…

光伏儲能MPPT控制系統如何進行浪涌靜電保護?

MPPT(Maximum Power Point Tracking)是太陽能電池板光伏發電系統中重要的一種控制技術。MPPT控制器能夠實時偵測太陽能板的發電電壓,并追蹤最高電壓電流值(VI),使系統以最大功率輸出對蓄電池充電&#xff0…

06 - ip route和route -n的區別

1 ip route和route -n的區別 ip route 和 route -n 都是用于查看和管理Linux系統路由表的命令。但下面是它們的區別: ip route:是Linux系統中的現代工具,它屬于iproute2套件;它提供了更多的選項,可以更精確地控制路由表…

使用git的小筆記

平時工作中使用git存儲項目代碼, 常用的命令 拉取倉庫代碼 git clone http://100.100.100.100:9080/my_test/test.git 拉取到以后, 先切換到自己的分支 git checkout my_name 一頓魔改代碼 然后 add 新增的文件或者修改的文件 git add * 然后提交 并寫…

【go從入門到精通】什么是go?為什么要選擇go?

go的出生: go語言(或Golang)是Google開發的開源編程語言,誕生于2006年1月2日下午15點4分5秒,于2009年11月開源,2012年發布go穩定版。Go語言在多核并發上擁有原生的設計優勢,Go語言從底層原生支持…