MySQL 事務(二)

文章目錄

  • 事務隔離性理論
    • 理解隔離性
    • 隔離級別
  • 事務隔離級別的設置和查看
  • 事務隔離級別
    • 讀未提交
    • 讀提交(不可重復讀)

在這里插入圖片描述

事務隔離性理論

  1. 理解隔離性
    MySQL服務可能會同時被多個客戶端進程(線程)訪問,訪問的方式以事務方式進行
  2. 一個事務可能由多條SQL構成,也就意味著,任何一個事務,都有執行前,執行中,執行后的階段。而所謂的原子性,其實就是讓用戶層要么看到執行前,要么看到執行后執行中出現問題,可以隨時回滾。所以單個事務,對用戶表現出來的特性,就是原子性。
  3. 但,畢竟所有事務都要有個執行過程,那么在多個事務各自執行多個SQL的時候,就還是有可能會出現互相影響的情況。比如:多個事務同時訪問同一張表,甚至同一行數據。
  4. 數據庫中,為了保證事務執行過程中盡量不受干擾,就有了一個重要特征:隔離性
  5. 數據庫中,允許事務受不同程度的干擾,就有了一種重要特征:隔離級別

理解隔離性

  1. sql操作都是具有原子性的,update和select,誰先來誰就先跑
  2. 每一個人都只能看到自己活著時候世界所對應的樣子,所以我們時間線一直在延展的時候,每個人看到的世界都應該是不一樣的,這才符合自然規律,人與人之間具有隔離性,因此讓每一個事務都看到最新的數據是不合理的,而是應該讓每一個事務在他到來時看到他應該看到的數據。這就是隔離性的體現。
  3. 隔離性具體要隔離到什么程度,我們就有了隔離級別的概念
  4. 隔離性就是你可以看到你出生后的時間線的內容,不能看到你出生前的內容
  5. 隔離級別是你試衣服的時候要進試衣間,試鞋子就不用進試衣間

在這里插入圖片描述

隔離級別

  1. 讀未提交:在該隔離級別,所有的事務都可以看到其他事務沒有提交的執行結果。(實際公司不會用這種),這種相當于沒有隔離級別
  2. 讀提交:一個事務commit之后,另一個事務可以看到這個事務的提交結果
  3. 可重復讀:相當于一個事務做完操作后,另一個事務也做完操作后,兩個事務都關閉后,重新啟動事務才能看到結果,在操作的途中是看不到結果的,類比于兩個小孩在渾濁的水中潛水,一個小孩要確認另一個小孩是否還在潛水要浮上水面才能知道結果,這是MySQL默認的隔離級別,在操作的途中看到的結果是相同的
  4. 串行化:事務最高的隔離級別,一個mysql執行完成后另一個mysql才能執行,會影響效率
  5. 隔離,基本都是通過鎖實現的,不同的隔離級別,鎖的使用是不同的

上面四種隔離級別關注的場景都是當有一個人在進行寫的時候另一個人來讀 (讀寫并發),讀讀的場景都用的是串行化,一個任務進行完才能進行下一個任務

事務隔離級別的設置和查看

1. 只影響當前事務的隔離級別,mysql會默認使用session的隔離級別
2. 全局的隔離級別對所有的事務都影響,全局的改了,當前會話的和另一個事務的都會改變(在重新登入后更改)

SELECT @@session.tx_isolation; 
--查看會話(當前)全局隔級別(默認用全局的初始化)
set global transaction isolation level READ UNCOMMITTED; 
-- 查看 
mysql> SELECT @@global.tx_isolation; 
--查看全局隔級別 
+-----------------------+ 
| @@global.tx_isolation | 
+-----------------------+ 
| REPEATABLE-READ       | 
+-----------------------+ 
1 row in set, 1 warning (0.00 sec) mysql> SELECT @@session.tx_isolation; 
--查看會話(當前)全局隔級別(默認用全局的初始化)
+------------------------+ 
| @@session.tx_isolation | 
+------------------------+ 
| REPEATABLE-READ        | 
+------------------------+ 
1 row in set, 1 warning (0.00 sec) mysql> SELECT @@tx_isolation; 
--默認同上,跟上面的一個是同一個意思 
+-----------------+ 
| @@tx_isolation  | 
+-----------------+ 
| REPEATABLE-READ |
+-----------------+ 
1 row in set, 1 warning (0.00 sec) --設置 
-- 設置當前會話 or 全局隔離級別語法 
// transaction 事務
// isolation 隔離
SET [SESSION | GLOBAL] transaction isolation  level
// 讀可不可提交,讀可提交,可重復讀,串行化
{READ UNCOMMITTED | READ COMMITTED | 
REPEATABLE READ | SERIALIZABLE} --設置當前會話隔離性,另起一個會話,看不多,只影響當前會話 
mysql> set session transaction isolation level serializable; -- 串行化 
Query OK, 0 rows affected (0.00 sec) mysql> SELECT @@global.tx_isolation; --全局隔離性還是RR 
+-----------------------+ 
| @@global.tx_isolation | 
+-----------------------+ 
| REPEATABLE-READ       | 
+-----------------------+ 
1 row in set, 1 warning (0.00 sec) mysql> SELECT @@session.tx_isolation; --會話隔離性成為串行化 
+------------------------+ 
| @@session.tx_isolation | 
+------------------------+ 
| SERIALIZABLE           | 
+------------------------+ 
1 row in set, 1 warning (0.00 sec) mysql> SELECT @@tx_isolation; --同上 
+----------------+ 
| @@tx_isolation | 
+----------------+ 
| SERIALIZABLE   | 
+----------------+ 
1 row in set, 1 warning (0.00 sec) --設置全局隔離性,另起一個會話,會被影響 
mysql> set global transaction isolation level READ UNCOMMITTED; 
Query OK, 0 rows affected (0.00 sec) mysql> SELECT @@global.tx_isolation; 
+-----------------------+ 
| @@global.tx_isolation | 
+-----------------------+ 
| READ-UNCOMMITTED      | 
+-----------------------+ 
1 row in set, 1 warning (0.00 sec) mysql> SELECT @@session.tx_isolation; 
+------------------------+ 
| @@session.tx_isolation | 
+------------------------+
| READ-UNCOMMITTED       | 
+------------------------+ 
1 row in set, 1 warning (0.00 sec)mysql> SELECT @@tx_isolation; 
+------------------+ 
| @@tx_isolation   | 
+------------------+ 
| READ-UNCOMMITTED | 
+------------------+ 
1 row in set, 1 warning (0.00 sec)-- 注意,如果沒有現象,關閉mysql客戶端,重新連接。

設置當前事務的隔離級別為讀提交

在這里插入圖片描述

事務隔離級別

讀未提交

  1. 臟讀:一個事務在執行中,讀到另一個執行中事務的更新(或其他操作)但是未commit的數據,兩個事務并發執行
  2. 幾乎沒有加鎖,雖然效率高,但是問題太多,嚴重不建議采用
--終端A 
-- 設置隔離級別為 讀未提交 
mysql> set global transaction isolation level read uncommitted; 
Query OK, 0 rows affected (0.00 sec) --重啟客戶端
mysql> select @@tx_isolation;
+------------------+
| @@tx_isolation   | 
+------------------+ 
| READ-UNCOMMITTED | 
+------------------+ 
1 row in set, 1 warning (0.00 sec)mysql> select * from account;
+----+--------+----------+
| id | name   | blance   | 
+----+--------+----------+ 
| 1  | 張三   | 100.00   | 
| 2  | 李四   | 10000.00 | 
+----+--------+----------+ 
2 rows in set (0.00 sec) mysql> begin;                   --開啟事務 
Query OK, 0 rows affected (0.00 sec)mysql> update account set blance=123.0 where id=1;  --更新指定行 
Query OK, 1 row affected (0.05 sec) 
Rows matched: 1  Changed: 1  Warnings: 0--沒有commit哦!!!--終端B mysql> begin;
mysql> select * from account;
+----+--------+----------+ 
| id | name   | blance   | 
+----+--------+----------+ 
| 1 | 張三    | 123.00   | --讀到終端A更新但是未commit的數據[insert,delete同樣] 
| 2 | 李四    | 10000.00 | 
+----+--------+----------+ 
2 rows in set (0.00 sec) 

讀提交(不可重復讀)

在這里插入圖片描述

-- 終端A 
mysql> set global transaction isolation level read committed; 
Query OK, 0 rows affected (0.00 sec) 
--重啟客戶端 
mysql> select * from account; --查看當前數據 
+----+--------+----------+ 
| id | name   | blance   | 
+----+--------+----------+ 
| 1  | 張三   | 123.00   | 
| 2  | 李四   | 10000.00 | 
+----+--------+----------+ 
2 rows in set (0.00 sec) mysql> begin; --手動開啟事務,同步的開始終端B事務 
Query OK, 0 rows affected (0.00 sec) mysql> update account set blance=321.0 where id=1; --更新張三數據 
Query OK, 1 row affected (0.00 sec) 
Rows matched: 1 Changed: 1 Warnings: 0 --切換終端到終端B,查看數據。 mysql> commit; --commit提交! 
Query OK, 0 rows affected (0.01 sec) --切換終端到終端B,再次查看數據。 --終端B 
mysql> begin; --手動開啟事務,和終端A一前一后 
Query OK, 0 rows affected (0.00 sec) mysql> select * from account; --終端A commit之前,查看不到 
+----+--------+----------+ 
| id | name   | blance   | 
+----+--------+----------+ 
| 1  | 張三   | 123.00   | --老的值 
| 2  | 李四   | 10000.00 | 
+----+--------+----------+ 
2 rows in set (0.00 sec) --終端A commit之后,看到了!
--but,此時還在當前事務中,并未commit,那么就造成了,同一個事務內,同樣的讀取,在不同的時間段(依舊還在事務操作中!),讀取到了不同的值,這種現象叫做不可重復讀(non reapeatable read)!!(這個是問題嗎??) 
mysql> select *from account; 
+----+--------+----------+ 
| id | name   | blance   | 
+----+--------+----------+ 
| 1  | 張三   | 321.00   |  --新的值 
| 2  | 李四   | 10000.00 | 
+----+--------+----------+ 
2 rows in set (0.00 sec) 

不可重復讀會出現什么問題呢?
兩個事務都同時啟動,一個事務提交了(關閉了),另一個運行的事務(查詢)看到第一個事務的提交結果是不合理的,兩個事務都應該是原子的

不可重復讀會造成問題嗎?會造成什么后果?
比如說小王要把tom的工資重3200改到4500,而小張負責工資表發放獎品的任務,小張要進行查詢的任務,當事務運行到3000到4000獎品的查詢時,查到了tom,之后小王提交了事務,在4000到5000獎品的查詢時,又查到了tom,這在公司就出現了問題

在這里插入圖片描述
所以我們不應該讓我們的用戶在實際操作的時候,兩個正在執行的事務一方能夠讀到另一方的提交。所以雖然讀提交比讀未提交隔離級別高,但是我們也不推薦!因為會導致上述的不可重復讀的問題!!

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

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

相關文章

代碼倉提交分支規范

以下是我部門開發時用的分支規范,參考于Linux社區 Tips 分支命名通常遵循一些最佳實踐和規則,以便使分支的用途和內容清晰易懂,就在寫一個文檔的主題一樣。 功能分支 (Feature Branches) 用于開發新功能。 命名格式:feature/功能名…

Google Earth Engine(GEE) 代碼詳解:批量計算_年 NDVI 并導出(附 Landsat 8 數據處理全流程)

一、代碼整體目標 基于 Landsat 8 衛星數據,批量計算 2013-2020 年研究區的 NDVI(歸一化植被指數),實現去云處理、數據合成、可視化及批量導出為 GeoTIFF 格式,適用于植被動態監測、生態環境評估等場景。 二、代碼分步解析(含核心原理與易錯點) 1. 加載并顯示研究區邊…

Maven 處理依賴沖突

Maven處理依賴沖突 什么是依賴沖突?如何解決?Maven自動處理依賴沖突的規則路徑優先原則第一聲明優先原則注意 子模塊覆蓋父模塊父模塊聲明dependency子模塊覆蓋dependency父模塊聲明dependencyManagement 子模塊覆蓋dependency父模塊聲明dependencyManag…

docker 安裝 sqlserver2022 和注意點

一、前言 1、可以直接參考微軟官方文檔 快速入門:使用 Docker 運行 SQL Server Linux 容器映像,這里主要是說一些注意點和坑 二、安裝 1、拉取鏡像 docker pull mcr.microsoft.com/mssql/server:2022-latest2、創建掛載目錄,這里只是比官方…

Dagster Pipes系列-1:調用外部Python腳本

本文是"Dagster Pipes教程"的第一部分,介紹如何通過Dagster資產調用外部Python腳本并集成到數據管道中。首先,創建Dagster資產subprocess_asset,利用PipesSubprocessClient資源執行外部腳本external_code.py,實現跨進程…

【SQL系列】多表關聯更新

💝💝💝歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

C++進階學習:STL常用容器--map/multimap容器

1. map 容器基本概念 map 中所有元素都是 pair pair 中第一個元素為 key (鍵值) 起到索引運用 第二個元素為 value(實值) 所有元素都會根據元素的鍵值自動排序 本質: map/multimap 屬于關聯式容器 底層結構是用二…

let,const,var關鍵字的區別

let,const,var關鍵字 let,const,var都存在變量提升 它們都存在變量提升但是稍微有點不同 var變量聲明會被提升到作用域的頂部,并且會被初始化為 undefinedlet 和 const:變量聲明也會被提升到作用域的頂部,但不會被初…

Nuitka 已經不再安全? Nuitka/Cython 打包應用逆向工具 -- pymodhook

pymodhook是一個記錄任意對Python模塊的調用的庫,用于Python逆向分析。 pymodhook庫類似于Android的xposed框架,但不僅能記錄函數的調用參數和返回值,還能記錄模塊的類的任意方法調用,以及任意派生對象的訪問,基于pyob…

path環境變量滿了如何處理,分割 PATH 到 Path1 和 Path2

要正確設置 Path1 的值,你需要將現有的 PATH 環境變量 中的部分路徑復制到 Path1 和 Path2 中。以下是詳細步驟: 步驟 1:獲取當前 PATH 的值 打開環境變量窗口: 按 Win R,輸入 sysdm.cpl,點擊 確定。在 系…

SEMI E40-0200 STANDARD FOR PROCESSING MANAGEMENT(加工管理標準)-(一)

1 目的 物料(例如晶圓)加工在設備中的自動化管理與控制是實現工廠自動化的關鍵要素。本標準針對半導體制造環境中與設備內部物料處理相關的通信需求進行了規范。本標準規定了在加工單元接收到的指定材料所應適用的加工方法(例如Etch腔室需要Run哪支Recipe)。它闡述了物料加工的…

【Hadoop】集群搭建實戰:超詳細保姆級教程

🐇明明跟你說過:個人主頁 🏅個人專欄:《大數據前沿:技術與應用并進》🏅 🔖行路有良友,便是天堂🔖 目錄 一、引言 1、Hadoop簡介 2、Hadoop集群概念 3、 Hadoop 集…

阿里云人工智能大模型通義千問Qwen3開發部署

本文主要描述阿里云人工智能大模型開源社區ModelScope提供的通義千問Qwen3開發部署。 與阿里云一起 輕松實現數智化 讓算力成為公共服務:用大規模的通用計算,幫助客戶做從前不能做的事情,做從前做不到的規模。讓數據成為生產資料:…

24.(vue3.x+vite)引入組件并動態掛載(mount)

示例截圖 組件代碼: <template><div><div>{{message }}</div>

《Python星球日記》 第56天:循環神經網絡(RNN)入門

名人說:路漫漫其修遠兮,吾將上下而求索。—— 屈原《離騷》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder??) 目錄 一、序列數據的特點與挑戰1. 什么是序列數據?2. 序列數據的挑戰二、RNN 的基本結構與前向傳播1. RNN的核心理念2. RNN的數學表達3. RNN的前向傳…

手寫 vue 源碼 === computed 實現

目錄 計算屬性的基本概念 計算屬性的核心實現 ComputedRefImpl 類的實現 ReactiveEffect 與計算屬性的關系 計算屬性的工作流程 1. 創建計算屬性 2. 依賴收集過程 3. 嵌套 effect 的處理 4. 更新過程 嵌套 effect 關系圖解 依賴關系建立過程 代碼實現分析 1. 創建…

【Lattice FPGA 開發】Diamond在線調試Reveal邏輯亂跳的解決

在Vivado中在always塊中寫邏輯時如果出現always塊中的異步復位敏感詞在塊內部未使用的情況&#xff0c;如下例的rst&#xff1a; always (posedge clk or posedge rst) begin if(~tx_sense_flag)o_rd_adr < d1;else if((o_rd_adr d94) & (bit_cnt d7))o_rd_adr <…

【hadoop】Sqoop數據遷移工具的安裝部署

一、Sqoop安裝與配置 步驟&#xff1a; 1、使用XFTP將Sqoop安裝包sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz發送到master機器的主目錄。 2、解壓安裝包&#xff1a; tar -zxvf ~/sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz 3、修改文件夾的名字&#xff0c;將其改為s…

BUUCTF——PYWebsite

BUUCTF——PYWebsite 進入靶場 看看基本信息 沒有什么信息 掃個目錄看看 http://node5.buuoj.cn:28115/.DS_Store http://node5.buuoj.cn:28115/flag.php http://node5.buuoj.cn:28115/index.html訪問flag.php 提示保存購買者的IP 抓包看看 直接XFF偽造一下 X-Forwarded-F…

基于Qt開發的多線程TCP服務端

目錄 一、Qt TCP服務端開發環境準備1. 項目配置2. 核心類說明二、服務端搭建步驟詳解步驟1:初始化服務端對象步驟2:啟動端口監聽步驟3:處理客戶端連接三、數據通信與狀態管理1. 數據收發實現2. 客戶端狀態監控四、進階功能擴展1. 多客戶端并發處理2. 心跳檢測機制五、調試與…