【MySQL數據庫】事務

目錄

1,事務的詳細介紹

2,事務的屬性

3,事務常見的操作方式


1,事務的詳細介紹

????????在MySQL數據庫中,事務是指一組SQL語句作為一個指令去執行相應的操作,這些操作要么全部成功提交,對數據庫產生影響;要么全部失敗回滾(撤銷當前事務所做的更改),不對數據庫產生任何影響。事務確保了數據庫的一致性和完整性,即保證了不同的客戶端看到的數據是不相同的,以下是事務的通俗說明:

????????事務就是要做的或所做的事情,主要用于處理操作量大,復雜度高的數據。假設一種場景:你畢業了,學校的教務系統后臺 MySQL 中,不在需要你的數據,要刪除你的所有信息,那么要刪除你的基本信息(姓名,電話,籍貫等)的同時,也刪除和你有關的其他信息,比如:你的各科成績等。這樣,就需要多條 MySQL 語句構成,那么所有這些操作合起來,就構成了一個事務。

? ? ? ? 為什么要有事務呢?事務本質是為了當應用程序訪問數據庫的時候,事務能夠簡化我們的編程模型,不需要我們去考慮各種各樣的潛在錯誤和并發問題。事務不僅保證了數據的一致性和完整性,還提高了系統的可靠性。通過正確地使用事務,可以有效地管理和維護數據庫的狀態。總的來說,事務是數據庫管理系統中不可或缺的一部分。

????????注意:在 MySQL 中,只有使用了 Innodb 存儲引擎的數據庫或表才支持事務。

2,事務的屬性

????????一個 MySQL 數據庫上,可不止一個事務在運行,同一時刻,甚至有大量的請求被包裝成事務,在向 MySQL 服務器發起事務處理請求。而每條事務至少一條 SQL,甚至有更多個 SQL,如果大家都訪問同樣的表數據,在不加保護的情況,就絕對會出現問題。因為事務由多條 SQL 構成,所以這里就會出現很多問題,比如 SQL 執行到一半出錯或中途停止往后執行的情況。因此,一個完整的事務,絕對不是簡單的 sql 集合,還擁有四個屬性:

  1. 原子性:事務是一個不可分割的工作單位,要么全部完成,要么全部不完成,不會在中間某個環節結束。若事務在執行過程中發生錯誤,它就會被回滾到事務開始前的狀態,就像這個事務從來沒有執行過一樣。
  2. 一致性:在事務開始之前和事務結束以后,數據庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、關聯性,以及后續數據庫可以自發性地完成事先預定的工作。
  3. 隔離性:一個事務所做的修改在最終提交以前,對其它事務是不可見的。數據庫允許多個并發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務并發執行時由于交叉執行而導致數據的不一致。
  4. 持久性:事務處理結束后,其所做的修改就會永久保存在數據庫中。

????????事務的四個屬性可以簡稱為 ACID。

3,事務常見的操作方式

1,事務的提交方式

????????事務的提交方式常見的有兩種:自動提交手動提交

????????自動提交意味著每執行完一條語句,MySQL 會自動將更改指令提交到數據庫,使更改永久化。自動提交方式下,這里的每個單獨 SQL 語句都被視為一個獨立的事務,在執行后會立即被提交到數據庫。

? ? ? ? 手動提交意味著,在你執行一系列的 SQL 語句之后,需要手動執行指令(commit指令)來提交事務,使所有更改生效。具體的流程后面運用時會說明。? ?

查看事務的提交方式:show variables like 'autocommit';

? ? ? ? 上面圖中,ON表示自動提交,OFF表示手動提交。默認情況下是自動提交(ON)。?

修改事務的提交方式,用 set 指令:set autocommit=0;? ? ? ?

說明:0表示禁止自動提交,1表示開啟自動提交????????????????????????????????????????????????????????

? ? ? ? 注意:上面操作選擇手動提交和自動提交時,僅是對當前會話的操作,其它終端啟動時仍是MySQL 默認的情況。?

2,事務的隔離

????????事務的隔離是指事務的隔離性,它確保了不同的事務在并發執行時不會互相干擾。事務的隔離并不是將所有的數據都隔離,因為不同的事務之間可能存在聯系,因此,在數據庫中,允許事務受不同程度的干擾,就有了一種重要特征:隔離級別

????????MySQL支持四種標準的事務隔離級別:

????????讀未提交:這是最低的隔離級別,在這個級別上,事務可以讀取未被其他事務提交的數據,這可能會出現臟讀,即一個事務能夠看到另一個事務尚未提交的更改,導致事務讀取到的數據是一個臨時數據或錯誤數據。(實際生產中不可能使用這種隔離級別的,它相當于沒有提供事務間的隔離)

????????讀提交:事務只能讀取已經被其他事務提交的數據,也就是說事務沒有提交之前,其它正在運行的事務都是看不到的。這種隔離級別會引起不可重復讀,也就是同一個事務在不同時間點讀取同一行數據可能會得到不同的結果,例如:事務A提交了數據,那么事務B就會看到已經被事務A修改過的數據,原本的數據已經被修改了。

????????可重復讀:這是 MySQL 默認的隔離級別。在這個級別上,一個事務在執行中,多次讀取操作數據時,會看到同樣的數據行,即使其他事務對數據進行了修改并提交。這意味著在一個事務開始后,它將不會看到其他事務所做的任何更改,從而避免了不可重復讀的問題。不過,在此隔離級別下,仍然可能存在幻讀問題,即在同一事務中兩次查詢可能得到不同的行集合,通常是因為其他事務插入了記錄(其他事務的插入操作,可重復讀無法屏蔽其操作)。例如:事務A提交了數據,事務B看到的數據仍然是最開始的數據,即便事務A修改了此數據,除非結束事務B。

????????串行化:這是事務的最高隔離級別,它通過強制事務排序,使之不可能相互沖突, 從而解決了幻讀的問題。具體操作是,它在每個讀取操作上都會加上共享鎖,導致事務按順序執行,這會極大地降低性能,并發度最低,因為可能會導致超時和鎖競爭。(這種隔離級別太極端,實際生產基本不使用)

3,設置事務的隔離級別

? ? ? ? 四種隔離級別:READ UNCOMMITTED(讀未提交)、READ COMMITTED(讀已提交)、REPEATABLE READ(可重復讀)、SERIALIZABLE(可串行化)。默認情況下,MySQL數據庫對應的是REPEATABLE READ(可重復讀)

查看當前會話的事務隔離級別(只影響當前連接):

? ? ? ? select @@transaction_isolation;

查看全局的事務隔離級別(整個MySQL服務器采用的事務隔離級別,也是所有新連接的默認設置):

????????select @@global.transaction_isolation;

設置當前會話的事務隔離級別

? ? ? ? set session transaction isolation level [隔離的四種級別];

設置全局的事務隔離級別

? ? ? ? set global transaction isolation level?[隔離的四種級別];

4,事務的操作流程

? ? ? ? MySQL運用事務時,具體的詳細流程是:

? ? ? ? 1,根據需求,選擇事務的隔離級別,MySQL默認是REPEATABLE READ(可重復讀)。

? ? ? ? 2,查看事務的提交方式,根據需求進行設置。默認情況下的提交方式是自動提交,一條單獨的 SQL 語句就是一個獨立的事務,直接 SQL 指令操作即可,如同平常的一般操作。如果你希望執行一系列操作作為一個整體(也就是一個事務),然后進行提交,那么就需要使用手動提交。下面的操作流程都是按照手動提交的方式進行的,自動提交沒有任何流程。

????????3,開啟一個事務。需注意,使用指令開啟一個新事務時,這隱含地使用手動提交方式,即set autocommit=0;(關閉自動提交),但不會改變全局或會話變量的實際值,也就是說使用?show variables like 'autocommit'; 查看到的提交方式仍沒有變化。

(除非你顯式設置)。

開啟一個事務:start transaction; begin;? ? ? ? 此時的提交方式是手動提交

? ? ? ? 4,設置保存點。保存點可根據需求自由選擇設置。在復雜的事務中,可能需要部分回滾。MySQL允許你在事務中設置保存點,然后選擇性地回滾到某個保存點。至于保存點的釋放也是可選擇的,因為 MySQL 在事務結束后會自動釋放未釋放的保存點。

設置保存點:savepoint [保存點名稱];

釋放保存點:release savepoint [保存點名稱];

例如:

????????創建一個保存點save1:savepoint save1;? ? ?

????????釋放保存點save1:release savepoint save1;

? ? ? ? 5,執行事務中的 SQL 操作。這里就開始進行?SQL 操作了。

? ? ? ? 注意:4和5通常是一體的,即每次操作時,先設置保存點,然后指定 SQL 操作。

????????6,回滾事務。回滾操作也是自由選擇的操作。該操作是為了防止事務在處理過程中所發生的錯誤。回滾操作分為兩類:1,回滾到事務開始的最初狀態,即撤銷事務中的所有操作。2,選擇性地回滾到某個保存點,即回滾到某一個保存點所保存的指令。

回滾到最初狀態:rollback;

回滾到保存點:rollback to [保存點名稱];

例如:rollback to?save2; ? ? ?回滾到保存點save2

? ? ? ? 7,提交事務。當你完成了事務中的所有操作,就可以提交對事務所做的操作了,即手動提交,結束事務。這時,事務中的所有更改都會被保存到數據庫中。

提交事務:commit

? ? ? ? 下面來以具體的樣例說明:

創建一個 test 表:create table test(id int primary key,name varchar(50));

查看提交方式:show variables like 'autocommit';

開始一個事務:begin;

創建一個保存點save1:savepoint save1;

插入一條記錄:insert into test values (1, '李白');

創建一個保存點save2:savepoint save2;

插入一條記錄:insert into test values (2, '杜甫');

查看操作:select * from test;? ? ?數據已經存在,但沒有commit,此時只是在該終端下查看

回滾到保存點save2:rollback to save2;

再次查看:select * from test;? ? ? ?此時沒有(2,'杜甫')的記錄,因為發生了回滾

回滾在最開始:rollback;? ? ? ? ? ? ?此時再次查看發現一條記錄也沒有了

????????注意:事務的操作過程中,當操作異常時,MySQL會自動回滾。


? ? ? ? 事務的隔離底層往往是運用相應的鎖來控制。隔離級別越嚴格,安全性就越高,但數據庫的并發性能也就越低,實際情況中往往需要在兩者之間找一個平衡點。

????????如果系統運行發生中斷,使某個事務尚未完成而被迫中斷,這時,使用 InnoDB 存儲引擎的MySQL 數據庫能夠通過其內置的日志和恢復機制來維護數據的一致性和完整性。對于未提交的事務,它會被回滾。

? ? ? ? 總結一下,不可重復讀的重點是修改和刪除,即同樣的條件,讀取過的數據再次讀取出來時,發現值不一樣了。幻讀的重點在于新增行,即同樣的條件,第1次和第2次讀出來的記錄數不一樣。MySQL 默認的隔離級別是可重復讀,一般情況下不要修改。

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

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

相關文章

一、OrcaSlicer源碼編譯

一、下載 1、OrcaSlicer 2.3.0版本的源碼 git clone https://github.com/SoftFever/OrcaSlicer.git -b v2.3.0 二、編譯 1、在OrcaSlicer目錄運行cmd窗口,輸入build_release.bat 2、如果出錯了,可以多運行幾次build_release.bat 3、在OrcaSlicer\b…

港口危貨儲存單位主要安全管理人員考試精選題目

港口危貨儲存單位主要安全管理人員考試精選題目 1、危險貨物儲存場所的電氣設備應符合( )要求。 A. 防火 B. 防爆 C. 防塵 D. 防潮 答案:B 解析:港口危貨儲存單位存在易燃易爆等危險貨物,電氣設備若不防爆&…

格雷希爾用于工業氣體充裝站的CZ系列氣罐充裝轉換連接器,其日常維護有哪些

格雷希爾氣瓶充裝連接器,長期用于壓縮氣體的快速充裝和壓縮氣瓶的氣密性檢測,需要進行定期的維護,為每一次的充裝提供更好的連接。下列建議的幾點維護準則適用于格雷希爾所有充注接頭,請非專業人士不要隨意拆卸連接器。 格雷希爾氣…

Java 多線程進階:什么是線程安全?

在多線程編程中,“線程安全”是一個非常重要但又常被誤解的概念。尤其對于剛接觸多線程的人來說,不理解線程安全的本質,容易寫出“偶爾出錯”的代碼——這類 bug 往往隱蔽且難以復現。 本文將用盡可能通俗的語言,從三個角度解釋線…

MSO-Player:基于vlc的Unity直播流播放器,支持主流RTSP、RTMP、HTTP等常見格式

MSO-Player 基于libVLC的Unity視頻播放解決方案 支持2D視頻和360度全景視頻播放的Unity插件 📑 目錄 🎥 MSO-Player 📋 功能概述🚀 快速入門📚 關鍵組件📝 使用案例🔌 依賴項📋 注意…

navicat中導出數據表結構并在word更改為三線表(適用于navicat導不出doc)

SELECTCOLUMN_NAME 列名,COLUMN_TYPE 數據類型,DATA_TYPE 字段類型,IS_NULLABLE 是否為空,COLUMN_DEFAULT 默認值,COLUMN_COMMENT 備注 FROMINFORMATION_SCHEMA.COLUMNS WHEREtable_schema db_animal(數據庫名) AND table_name activity(…

docker學習筆記6-安裝wordpress

一、創建自定義網絡、查看網絡 docker netword create blog docker network ls 二、 啟動mysql容器 啟動命令: docker run -d -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD123456 \ -e MYSQL_DATABASEwordpress \ -v mysql-data:/var/lib/mysql \ -v /app/myconf:/etc…

03_Mybatis-Plus LambadaQueryWrapper 表達式爆空指針異常

&#x1f31f; 03_MyBatis-Plus LambdaQueryWrapper 爆出空指針異常的坑點分析 ? 場景描述 來看一段常見的 MyBatis-Plus 查詢寫法&#xff0c;是否存在問題&#xff1f; Page<VideoInfoVo> videoInfoVosPage videoMapper.selectPage(page, new LambdaQueryWrapper&…

WEB安全--社會工程--SET釣魚網站

1、選擇要釣魚的網站 2、打開kali中的set 3、啟動后依次選擇&#xff1a; 4、輸入釣魚主機的地址&#xff08;kali&#xff09;和要偽裝的網站域名&#xff1a; 5、投放釣魚網頁&#xff08;服務器域名:80&#xff09; 6、獲取賬號密碼

Ethan獨立開發產品日報 | 2025-04-29

1. mrge 代碼審查的光標 mrge 是一個由人工智能驅動的代碼審查平臺&#xff0c;能夠自動審核拉取請求&#xff08;PR&#xff09;&#xff0c;為人工審查員提供超級能力。它是像 cal.com 和 n8n 這樣快速發展的團隊的首選工具。 關鍵詞&#xff1a;mrge, 代碼審查, AI驅動, …

ubuntu22.04 qemu arm64 環境搭建

目錄 創建 安裝 Qemu 啟動 # 進入qemu虛擬機后執行 qemu編譯器安裝 創建 qemu-img create ubuntu22.04_arm64.img 40G 安裝 qemu-system-aarch64 -m 4096 -cpu cortex-a57 -smp 4 -M virt -bios QEMU_EFI.fd -nographic -drive ifnone,fileubuntu-22.04.5-live-server-a…

安全生產知識競賽宣傳口號160句

1. 安全生產是責任&#xff0c;每個人都有責任 2. 安全生產是保障&#xff0c;讓我們遠離危險 3. 安全生產是團結&#xff0c;共同守護每一天 4. 注重安全&#xff0c;守護明天 5. 安全生產無小事&#xff0c;關乎千家萬戶 6. 安全第一&#xff0c;人人有責 7. 安全生產無差別&…

Python 虛擬環境管理:venv 與 conda 的選擇與配置

文章目錄 前言一、虛擬環境的核心價值1.1 依賴沖突的典型場景1.2 隔離機制實現原理 二、venv 與 conda 的架構對比2.1 工具定位差異2.2 性能基準測試&#xff08;以創建環境 安裝 numpy 為例&#xff09; 三、venv 的配置與最佳實踐3.1 基礎工作流3.2 多版本 Python 管理 四、…

【自然語言處理與大模型】如何獲取特定領域的微調數據集?

在特定領域中&#xff0c;數據集通常由提出需求的一方提供。然而&#xff0c;在某些情況下&#xff0c;如果他們未能提供所需的數據&#xff0c;或者你正在獨立開展一個項目&#xff0c;并且需要相應的數據來推進工作&#xff0c;這時你應該怎么辦呢&#xff1f;本文提供一種思…

Map系列之ConcurrentHashMap源碼分析:高并發場景下的性能密碼

引言&#xff1a;當線程安全成為剛需 1.1 并發時代的Map困境 經典案例&#xff1a;電商秒殺系統超賣事故分析&#xff08;附線程堆棧截圖&#xff09;傳統方案缺陷&#xff1a;synchronizedMap的吞吐量陷阱&#xff08;JMH測試數據對比&#xff09;ConcurrentHashMap的定位&a…

URP - 序列圖動畫的實現

效果&#xff1a; 【太妃糖耶】更新了一條視頻&#xff0c;快來圍觀&#xff01; 序列圖動畫的實現 首先先了解下序列圖樣式的紋理圖片 如上圖一可在Shader中使用該圖片制作燃燒的火的動畫&#xff0c;但是如何實現呢&#xff1f;接下來一起來看一下吧 序列圖動畫的實現原理大…

python中 str.strip() 是什么意思

在 Python 中&#xff0c;str.strip() 是字符串&#xff08;str&#xff09;類型的一個方法&#xff0c;用于移除字符串兩端的空白字符&#xff08;默認情況下&#xff09;或指定字符&#xff0c;并返回處理后的新字符串。 語法&#xff1a; str.strip([chars])chars&#xf…

記錄idea可以運行但是maven install打包卻找不到問題

解決idea使?maven多模塊install報依賴模塊的包找不到的問題 如果被依賴項?是springboot項?&#xff0c;那么可以把相關的springboot的東西移除掉&#xff0c;改造成普通項?。如果不想改造項?&#xff0c;那就添加部分的配置&#xff0c;因為springboot項?打包的時候會?…

uniapp如何獲取安卓原生的Intent對象

通過第三方app喚起&#xff0c;并且獲取第三方app喚起時攜帶的參數 因為應用a喚起應用b時&#xff0c;應用b第一時間就要拿到參數token&#xff0c;所以需要將獲取參數的方法寫在APP.vue中的onLaunch鉤子里,如果其他地方要用可以選擇vuex或者采用本地緩存。 uniapp中plus.run…

《多端統一的終極答案:X5內核增強版的渲染優化全解析》

跨端應用的需求呈爆發式增長&#xff0c;無論是電商購物、社交互動&#xff0c;還是金融理財類應用&#xff0c;都期望能夠在不同平臺上為用戶提供一致且流暢的體驗。而在這一過程中&#xff0c;跨端渲染技術成為了關鍵瓶頸。騰訊X5內核增強版的出現&#xff0c;猶如一道曙光&a…