(新手友好)MySQL學習筆記(完):事務和鎖

事務和鎖

事務

transaction,一組原子性的SQL查詢,或者說是一個獨立的工作單元。如果能夠成功執行這組查詢的全部語句,就會執行這組查詢;如果其中任何一條語句無法成功執行,那么這組查詢的所有語句都不會執行。

也就是說,事務內部的語句,要么全部執行成功,要么全部執行失敗。

使用事務

  • 開始標志:任何一條DML語句的執行
  • 結束標志:
    • 提交:成功的結束,將所有的DML語句操作記錄和底層硬盤文件中數據進行同步
    • 回滾:失敗的結束:將所有DML語句操作記錄全部清除

MySQL默認是自動提交

#開啟事務
start transaction;
#提交事務
commit;
#保存回滾點
savepoint 回滾點名;
#回滾事務
rollback[to 回滾點名];#查看事務的提交方式
show variables like 'autocommit';
#啟用和關閉自動提交模式
set autocommit = 1;
set autocommit = 0;

舉例:轉賬業務

  • 創建表并插入數據
drop table if exists account;
create table account(id int primary key auto_increment,name varchar(20),money int check(money >= 0)
);
insert into account(name,money
)
values
('張三',20000),
('李四',500);
  • 自動提交和手動提交,再開一個MySQL—Front窗口查看數據變化

事務的四個特性(ACID)

ACID:

  • A(原子性 atomicity):事物是最小工作單元,不可再分,一個事務的所有操作要么全部執行成功,要么執行失敗全部回滾,不會出現成功一部分的情況
  • C(一致性 consisyency):數據庫總會從一個一致的狀態轉變成另一個一致的狀態,不會因為一條語句的失敗而出現另外的狀態,打個比方事物執行成功前的狀態是 0 ,執行成功后的狀態是 1,不會因為某一條語句的失敗而出現 0.5的狀態。
  • I(隔離性 isolation):通常來說,一個事物所做的修改在最終提交前,對于其他事物是不可見的,即在最終提交前該事務的修改不會影響到其他事務。
  • D(持久性 durability):事務一旦提交,其做的修改會持久的保存到數據庫中,即使系統崩潰,修改的數據也不會丟失。

一個兼容ACID的數據庫系統很多復雜但可能用戶并沒有察覺到的工作.相比沒有實現ACID的數據庫,通常回需要更強的CPU處理能力,更大的內存和更多的磁盤空間。

持久性原理:

一般事務的持久性都是借助redo log來實現的。

Redo log(重做日志)是一種日志文件,記錄了對于數據庫的修改操作(包括插入,修改刪除等等操作),它的主要作用就是確保系統或數據庫崩潰之后,系統能夠通過重做日志上記錄的操作,從而是數據庫回到事務提交后的狀態,確保事務的持久性。

并行事務帶來的問題

數據一致性問題:

  • 臟讀(dirty read):一個事務讀到另一個事務未提交的數據就是臟讀,因為一個事務對于一條記錄做修改,在該事務未提交前所做的修改隨時有可能回滾,因此被另一個事務讀到并回滾的數據就是臟數據。
  • 不可重復讀(non-repeatable read):在一個事務內多次讀取同一條記錄,前后結果不一致就是不可重復讀,比如事務A多次查詢同一行數據,在某次查詢間隔中,事務B對該行數據進行了修改并提交,導致事務A對該行數據的下次讀取出現了不一致,這種情況就叫不可重復讀。
  • 幻讀(phantom read):在一個事務內按照相同的條件多次查詢,前后結果集的數量不同就是幻讀,比如事務A按照id>5的條件進行多次查詢,出現幻讀前的查詢結果一直是count(*)=3,在某次查詢間隔中,事務B插入了一條id=9的數據并提交,那么在修改后事務A查詢到的結果就會變成count(*)=4,這就是幻讀問題。

注意:不可重復讀主要針對數據本身,幻讀則針對的是查詢讀取的結果集數量。

影響:

  • 臟讀:讀到其他事務未提交的數據
  • 不可重復讀:前后讀取的數據不一致
  • 幻讀:前后讀取的結果集數量不同

隔離級別

在SQL標準中定義了四個隔離級別,每一種級別都規定了一個事務中所做的修改,哪些事物內和事務間是可見的,哪些是不可見的。較低級別的隔離通常可以執行更高的并發,系統的開銷也更低。

  • 未提交讀(READ UNCOMMITED):事務中未提交的修改也可以被其他事務讀取到,這個隔離等級會出現包括臟讀,不可重復讀,幻讀問題,一般不用。
  • 提交讀(READ COMMITED):事務中的修改在提交之后才會被其它事務讀取到,這樣就避免了臟讀問題,但是還是會出現不可重復讀和幻讀問題。
  • 可重復讀(REPEATABLE READ):同一事物中多次讀取同樣記錄的結果是一致的,就解決的臟讀和不可重復讀的問題,但是幻讀問題還是未得到完全的解決,值得注意的一點是隔離級別是MySQL的默認隔離級別,又因為MySQL的特質該隔離級別可以解決大部分幻讀問題。
  • 串行化(SERIALIZABLE):強制事務串行執行,不會出現并行事務,所以就解決了臟讀,不可重復讀,幻讀的問題,該隔離等級會讀取的行上添加行鎖以及隔離鎖以避免幻讀問題,同時對于讀取操作加入共享鎖,寫入操作加入排他鎖,值得一提的串行化雖然能夠避免所有有關一致性的問題,但是因為它并發性能低,容易死鎖,效率低,在一般項目中很少用,更多的還是使用可重復讀或提交讀。

查看隔離級別:

#查看會話級的當前隔離級別:(會話級只對當前窗口有效)
select @@tx_isolation
select @@session.tx_isolation
#查看全局級的當前隔離級別:
select @@global.tx_isolation

設置隔離級別:

  • 方法1:my.ini文件中的[mysqld]下面添加transaction-isolation =隔離級別
  • 方法2:通過指令
#設置全局或當前會話范圍
set global transaction isolation level 隔離級別;
set session transaction isolation level 隔離級別;

實現隔離級別的兩種方法:

  • 加鎖:讀數據前對其,阻止其他事務對數據修改
  • 快照:讀取數據的快照(之前的版本)實現,例如,可重復讀級別在整個事務期間都讀取事務開始時的快照去解決不可重復讀問題。

InnoDB中的鎖

共享鎖和排他鎖

  • 共享鎖(S Lock):讀鎖,允許事務讀取數據
  • 排他鎖(X Lock):也叫獨占鎖,寫鎖,允許事務刪除或更新數據

如果事務獲取了某個數據的共享鎖,其他事務可以立即獲取該數據的共享鎖,這種情況叫鎖兼容。如果事務獲取了某個數據的共享鎖或排他鎖,其他事務想要獲取該數據的排他鎖,必須要等到該行的鎖被釋放掉。

排他鎖和共享鎖的兼容性

意向鎖

InnoDB允許事務在行鎖和表鎖同時存在。為支持在不同粒度上進行加鎖,InnoDB支持意向鎖。

意向鎖,將鎖定的對象分為多個層級,意向鎖意味著事務有意向在更細粒度上加鎖。如果需要加鎖,需要先對表意向鎖再對加行鎖。

意向鎖在InnoDB中就是表級別的鎖,支持兩種意向鎖:

  • 意向共享鎖(IS Lock),事務有意向對表中某些行加共享鎖
  • 意向排他鎖(IX Lock),事務有意向對表中某些行加排他鎖

表級鎖的兼容性

注意:意向鎖不會和行級鎖沖突,意向鎖之間也不會沖突,意向鎖只會和共享表鎖和排他表鎖沖突

意向鎖的作用:如果沒有意向鎖,想要給一個表加表鎖必須要檢查該表是否有表鎖和每一行是否有鎖。而如果在加行鎖前給這個表加上了意向鎖,這時只需要檢查表鎖和意向鎖就可以了,不需要檢查每一行鎖。

一致性非鎖定讀

一致性非鎖定讀,讀取正在執行delete和update操作的行時,不會等待該行上鎖的釋放,而是讀取該行的一個快照數據(該行之前的版本)。非鎖定讀極大的提高了數據庫的并發性,InnoDB默認時這種讀取方式,也就是說默認普通的select語句不會加鎖而是通過讀取快照實現數據一致性。

上面提到的快照數據就是該行數據的歷史版本,由此帶來的并發控制稱為多版本并發控制(MVCC)。

READ COMMITTED(提交讀)和REPEATABLE READ(可重復讀)在InnoDB中使用的是一致性非鎖定讀,但是讀取的快照不同。提交讀級別讀取的是最新版本的快照,可重復讀級別讀取的是事務開始時數據的快照。

可重復讀級別通過讀快照,可以解決前面提到的幻讀問題,但是有些情況需要鎖定讀。

一致性鎖定讀

InnoDB默認使用一致性非鎖定讀。某些情況用戶需要顯示加鎖保證數據的一致性,支持兩種一致性鎖定讀的操作。

  • select ... for update:對讀取的行加一個排他鎖
  • select ... lock in share mode:對讀取的行加一個共享鎖

如果只對讀取的行加鎖會有幻讀問題:

鎖定讀時使用鍵值間隙鎖(Next-Key Lock),就是行鎖加間歇鎖,來解決幻讀問題。

  • Record Lock:單行記錄的鎖,比如只鎖3這行記錄
  • Gap Lock:間歇鎖,鎖定一個范圍,但不包括記錄本身就像這樣只鎖(1-2)(4-5)個范圍的記錄
  • Next-Key Lock:Record Lock+Gap Lock,鎖定一個范圍,并鎖定記錄本身兩個相加就成了鎖定(1-5)所有的記錄

非鎖定讀使用快照和鎖定讀使用間歇鎖可以基本解決幻讀問題,但是極特殊情況還是有可能發生幻讀。

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

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

相關文章

【CMake】使用 CMake 將單模塊 C 項目構建為庫并鏈接主程序

目錄1. 項目結構設計📦 結構說明2. 項目文件內容2.1 頂層 CMakeLists.txt2.2 模塊 src/color/CMakeLists.txt ?【推薦寫法】?是否需要寫 project()?2.3 模塊頭文件 include/color.h2.4 模塊實現文件 src/color/color.c2.5 主程序 src/main.c3. 構建與運…

從零開始的云計算生活——番外4,使用 Keepalived 實現 MySQL 高可用

目錄 前言 一、架構原理? ?Keepalived 作用? ?MySQL 主從復制? 二、環境準備? 服務器要求?: 安裝基礎軟件? 三、配置 MySQL 主從復制 四、配置 Keepalived 主節點配置?(/etc/keepalived/keepalived.conf) 從節點配置 五、…

list類的常用接口實現及迭代器

目錄 1. list類的介紹 2.list類的常用接口 2.1 list類的常用構造 2.2 list類對象的容量操作 2.3 list迭代器 2.4 list類的常用操作 3.list的模擬實現 1. list類的介紹 list代表的是雙向鏈表,常見的有創建,增,刪,改幾個接口…

vscode Cline接入火山引擎的Deepseek R1

創建火山引擎Deepseek R1的API 在火山引擎管理控制臺中創建Deepseek R1推理接入點(大模型),創建成功后會看到下圖效果。在操作中選擇API調用,在頁面中選擇OpenAI SDK,按照步驟找到baseUrl地址和API_KEY,后續…

新手向:自動化圖片格式轉換工具

大家好!今天我要分享一個非常實用的Python小工具——圖片格式批量轉換器。如果你經常需要處理大量不同格式的圖片文件,或者需要統一圖片格式以便于管理,那么這個工具將會成為你的得力助手!一、為什么需要圖片格式轉換?…

CUDA中的內存管理、鎖頁內存、UVA統一虛擬地址、零拷貝、統一內存

文章目錄0 前言1 swap內存跟鎖頁內存2 UVA(Unified Virtual Addressing)統一虛擬地址3 先看最普通的cuda內存分配、釋放、傳輸4 申請鎖頁內存4.1 cudaHostAllocDefault4.2 cudaHostAllocPortable4.3 cudaHostAllocWriteCombined4.3 cudaHostAllocMapped4.4 幾種鎖頁內存總結4.5…

微服務環境下的灰度發布與金絲雀發布實戰經驗分享

微服務環境下的灰度發布與金絲雀發布實戰經驗分享 在大規模微服務架構中,如何平滑安全地上線新功能是每個后端團隊的痛點。本文將結合生產環境中的真實案例,分享灰度發布(Gray Release)與金絲雀發布(Canary Release&am…

MEF 在 WPF 中的簡單應用

MEF核心筆記MEF 的開發模式主要適用于插件化的業務場景中,C/S 和 B/S 中都有相應的使用場景,其中包括但不限于 ASP.NET MVC 、ASP WebForms、WPF、UWP 等開發框架。當然,DotNet Core 也是支持的。 以下是搜索到一些比較好的博文供參考&#…

Gitlab跑CICD的時候,maven鏡像和pom.xml使用的maven版本沖突導致沒辦法build成功的解決方法

是這樣的!最近遇到一個非常棘手的難題,我搞了大概2周時間才把他弄出來,因為自己搭了個私服的maven倉庫,他不像maven官方倉庫一樣,可以跟nginx一樣轉的,所以遇到好幾個難點!第一點:就…

Linux內核IPv4路由查找:LPC-Trie算法的深度實踐

在互聯網基礎設施的核心領域,路由查找性能直接決定了網絡轉發效率。Linux內核作為現代網絡系統的基石,其IPv4路由子系統采用了一種名為LPC-Trie(Level-Compressed Trie) 的創新數據結構,在net/ipv4/fib_trie.c文件中實現了高效的路由管理方案。本文將深入剖析這一機制的設…

【設計模式】裝飾(器)模式 透明裝飾模式與半透明裝飾模式

裝飾模式(Decorator Pattern)詳解一、裝飾模式簡介 裝飾模式(Decorator Pattern) 是一種 結構型設計模式,它允許你動態地給對象添加行為或職責,而無需修改其源代碼,也不需要使用繼承來擴展功能。…

NAT原理與實驗指南:網絡地址轉換技術解析與實踐

NAT實驗 NAT(Network Address Translation,網絡地址轉換): NAT技術的介紹: 隨著Internet用戶的快速增長,以及地址分配不均等因素,IPv4地址(約40億的空間地址)已經陷入不…

設計模式之【觀察者模式】

目錄 觀察者模式中的角色 通過一個簡單案例來演示觀察者模式 被觀察者接口 事件類型 up主類作為被觀察者 觀察者接口 粉絲類作為觀察者 測試 測試結果 觀察者模式中的角色 被觀察者(observable)觀察者(observer) 通過一個簡單案例來演示觀察者模式 被觀察者接口 /*…

Linux sudo host權限提升漏洞(CVE-2025-32462)復現與原理分析

免責聲明 本文所述漏洞復現方法僅供安全研究及授權測試使用; 任何個人/組織須在合法合規前提下實施,嚴禁用于非法目的; 作者不對任何濫用行為及后果負責,如發現新漏洞請及時聯系廠商并遵循漏洞披露規則。 漏洞簡述 Linux sudo是l…

【uni-ui】hbuilderx的uniapp 配置 -小程序左滑出現刪除等功能

1.網址:https://ext.dcloud.net.cn/plugin?id181](https://ext.dcloud.net.cn/plugin?id181) 2.csdn講解:https://blog.csdn.net/qq_40323256/article/details/114337128 3.uni-ui git:https://github.com/dcloudio/uni-ui 4.官方網址文檔&…

記一次POST請求中URL中文參數亂碼問題的解決方案

POST請求中URL中文參數亂碼前言:一個常見的開發痛點一、問題現象與原因深度解析1. 典型問題場景2. 根本原因分析URL編碼規范問題:編碼解碼過程不一致:IE瀏覽器特殊行為:二、前端解決方案1. 手動編碼URL參數(推薦&#…

從存儲熱遷移流程了解 QEMU block layer

文章目錄存儲熱遷移流程總體流程代碼路徑QEMU Block layer架構簡述Block Job結構體設計狀態轉換Mirror block job拓撲結構構建過程數據結構存儲熱遷移流程 總體流程 Libvirt migrate 命令提供 copy-storage-all 選項支持存儲熱遷移,相應地,Libvirt 熱遷…

【設計模式】命令模式 (動作(Action)模式或事務(Transaction)模式)宏命令

命令模式(Command Pattern)詳解一、命令模式簡介 命令模式(Command Pattern) 是一種 行為型設計模式(對象行為型模式),它將一個請求封裝為一個對象,從而使你可以用不同的請求對客戶進…

HTML5智能排班日歷:動態排班一目了然

這個日歷將具備以下功能: 顯示一個標準的月度日歷視圖。可以自由切換上一個月和下一個月。在日歷的每一天自動顯示當天值班的人員。您可以很方便地在文件中修改值班人員列表和排班的起始日期。包括:動態生成日歷網格處理月份切換根據排班規則計算并顯示每天的值班人員<!DO…

深度剖析C++生態系統:一門老牌語言如何在開源浪潮中煥發新生?

&#x1f4dd;個人主頁&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; 一、前言&#xff1a;C的“長壽秘訣”是什么&#xff1f; C 誕生已超過 40 年。它經歷了桌面應用、互聯網爆發、移動時代&#xff0c;再…