Mysql事務與鎖

數據庫并發事務

????????數據庫一般都會并發執行多個事務,多個事務可能會并發的對相同的一批數據進行增刪改查操作,可能就會導致我們說的臟寫、臟讀、不可重復讀、幻讀這些問題。為了解決這些并發事務的問題,數據庫設計了事務隔離機制、鎖機制、MVCC多版本并發控制隔離機制,用一整套機制來解決多事務并發問題。

事務特性:ACID

  • 原子性(Atomicity):
  • 一致性(Consistent):
  • 隔離性(Isolation):
  • 持久性(Durable):

事務并發可能帶來的問題

  • 丟失更新或者臟寫:兩個事務同時更新一個數據,后提交的事務會把先提交的結果
  • 臟讀:A事務讀到了B事務未提交的數據。?如果B事務回滾,A則讀到了一個無效數據。
  • 不可重復讀:在一個事務中連續對同一數據讀多次,讀到的結果不一致。(其他事務做了修改)
  • 幻讀:在一個事務中,相同的條件多次統計記錄條數,個數不一致。(其他事務新增了滿足其條件的數據)

事務隔離級別

-- 看當前數據庫的事務隔離級別
show variables like 'tx_isolation';
-- 設置事務隔離級別
set tx_isolation='REPEATABLE-READ';

????????Mysql默認的事務隔離級別是可重復讀,用Spring開發程序時,如果不設置隔離級別默認用Mysql設置的隔離級別,如果Spring設置了就用已經設置的隔離級別。

  • 讀未提交:
  • 讀已提交(RC):
  • 可重復讀(RR):使用了MVCC機制, select是讀的事務開始時的快照版,update則是當前讀,讀的是數據庫中最新的值。
  • 串行化:

在一個事務中, 讀到的內容都是事務開始時的一個快照, 即讀取的內容不變; 但如果當前事務對一個記錄做修改(排他鎖,其他事務無法對這個記錄做修改), 修改的記錄再重新讀取,讀到的是最新的。

問題:隔離級別底層是怎么實現的呢?

  1. 樂觀鎖不要用在可重復讀級別, 要在更小的兩個隔離級別用
  2. 通過快照讀取,但并不是每個事務都創建一個對應的快照
  3. RC對并發要求高;RR對同一時間維度要求高

間隙鎖:鎖的是兩個值之間的空隙。

臨鍵鎖(Next-key Locks):行鎖和間隙鎖的組合,包含范圍的邊界。

樂觀鎖:java中用版本號實現。update tableA set amount = 200 where id = 1 and version=1;

悲觀鎖:java在sql中直接執行。update tableA set amount = amount + 500 where id=1

頁鎖:只有BDB存儲引擎支持葉鎖,鎖的資源比行鎖多,比表鎖少。考慮索引樹種的一個節點,就是對應一頁,相對于對這一頁加鎖。

讀/寫鎖/意向鎖

  • -- 手動增加表鎖
    lock table 表名稱 read(write), 表名稱2 read(write);
    -- 查看表上加過的鎖
    show open tables;
    -- 刪除表鎖
    unlock tables;
    -- 共享鎖/讀鎖
    select * from T where id=1 lock in share mode
    -- 排他鎖/寫鎖
    select * from T where id=1 for update
  1. 讀鎖:其他事務可讀,不可寫(阻塞); 當前事務可讀,不可寫
  2. 寫鎖:其他事務不可讀,不可寫(阻塞);當前事務可讀,可寫
  3. 意向鎖(Intention Lock):當有事務給表的數據行加了共享鎖或排他鎖,同時會給表設置一個標識,代表已經有行鎖了,其他事務要想對表加表鎖時,就不必逐行判斷有沒有行鎖可能跟表鎖沖突了,直接讀這個標識就可以確定自己該不該加表鎖。這個標識就是意向鎖。相當于對表加鎖。 分為意向共享鎖(IS)意向排他鎖(IX)

行/表鎖

行鎖添加方式

1. 更新操作where條件使用索引列

????????>update account set balance = 800 where name ='lilei';

2. lock in share mode(共享鎖)?

? ? ? ? >select * from T where id = 1 lock in share mode;

3. 排他鎖for update

????????>select * from test_innodb_lock where a=2 for update

無索引行鎖會升級為表鎖

????????鎖主要是加在索引上,如果對非索引字段更新,行鎖可能會變表鎖。

????????session1 執行:update account set balance = 800 where name ='lilei';

????????session2 對該表任一行操作都會阻塞住

????????InnoDB的行鎖是針對索引加的鎖,不是針對記錄加的鎖。并且該索引不能失效,否則都會從行鎖升級為表鎖。注意:并不是直接將整張表加上表鎖,因為有的記錄可能被其他事務鎖住。 (那這種情況是否能加鎖成功呢?

????????RR級別會升級為表鎖,RC級別不會升級為表鎖。(為什么?

行鎖競爭分析

show status like 'innodb_row_lock%'

對各個狀態量的說明如下:

Innodb_row_lock_current_waits: 當前正在等待鎖定的數量

Innodb_row_lock_time: 從系統啟動到現在鎖定總時間長度

Innodb_row_lock_time_avg: 每次等待所花平均時間

Innodb_row_lock_time_max:從系統啟動到現在等待最長的一次所花時間

Innodb_row_lock_waits:系統啟動后到現在總共等待的次數

對于這幾個狀態變量,比較重要的主要是:

Innodb_row_lock_time_avg (等待平均時長)

Innodb_row_lock_waits (等待總次數)

Innodb_row_lock_time(等待總時長)

尤其是當等待次數很高,而且每次等待時長也不小的時候,我們就需要分析系統中為什么會有如此多的等待,然后根據分析結果著手制定優化計劃。

InnoDB與MYISAM的最大不同

  1. InnoDB支持事務(TRANSACTION)
  2. InnoDB支持行級鎖

問題:為啥MyISAM不支持行級鎖?

  1. MyISAM在執行查詢語句SELECT前,會自動給涉及的所有表加讀鎖,在執行update、insert、delete操作會自動給涉及的表加寫鎖。
  2. InnoDB在執行查詢語句SELECT時(非串行隔離級別),不會加鎖。但是update、insert、delete操作會加行鎖

鎖相關幾個問題:

1、Mysql默認的隔離級別是可重復讀,有辦法可以解決幻讀嗎?

答:間隙鎖在某些情況下可以解決幻讀

那么間隙就有 id 為 (3,10),(10,20),(20,正無窮) 這三個區間,

在Session_1下面執行 update account set name ='zhuge' where id > 8 and id <18;,則其他Session沒法在這個范圍所包含的所有行記錄(包括間隙行記錄)以及行記錄所在的間隙插入或修改任何數據,即id在(3,20]區間都無法修改數據,注意最后那個20也是包含在內的。(3,20]整個區間可以叫做臨鍵鎖

間隙鎖是在可重復讀隔離級別下才會生效。間隙鎖是為了解決幻讀問題,所以作用在可重復讀級別。實際測試下來確實可可重復讀級別間隙鎖才生效。

2、多個查詢操作,是否要放在事務中?

答:這個問題主要是考察事務并發問題, 以及解決這些問題需要的隔離級別。

如果要保證讀取數據的一致性,那必須放在事務中, 且這個事務是可重復讀的隔離級別。

3、事務中,有讀和寫操作, 哪個放前?

答:更新等涉及到加鎖的操作盡可能放在事務靠后的位置。目的是減少鎖住的時間。

鎖優化

  1. 盡可能讓所有數據檢索都通過索引來完成,避免無索引行鎖升級為表鎖
  2. 合理設計索引,盡量縮小鎖的范圍
  3. 盡可能減少檢索條件范圍,避免間隙鎖
  4. 盡量控制事務大小,減少鎖定資源量和時間長度,涉及事務加鎖的sql盡量放在事務最后執行
  5. 盡可能用低的事務隔離級別

MVCC多版本并發控制

Mysql在讀已提交和可重復讀隔離級別下都實現了MVCC機制。

undo日志版本鏈

一行數據多個事務依次修改過后,在每個事務修改完后,Mysql會保留修改前的數據undo回滾日志,并且用兩個隱藏字段trx_id和roll_pointer把這些undo日志串聯起來形成一個歷史記錄版本鏈。

readview和可見性算法

????????readview和可見性算法其實就是記錄了sql查詢那個時刻數據庫里提交和未提交所有事務的狀態。

????????RR隔離級別,事務里每次執行查詢操作readview都是使用第一次查詢時生成的readview。保障事務內對同一個數據的查詢查的結果都一致。

????????RC隔離級別,事務里每次執行查詢操作readview都會按照數據庫當前狀態重新生成readview.保障讀取到其他事務提交的最新的結果。

事務開始時間

begin/start transaction 命令并不是一個事務的起點,在執行到它們之后的第一個修改操作或加排它鎖操作(比如select...for update)的語句,事務才真正啟動,才會向mysql申請真正的事務id,mysql內部是嚴格按照事務的啟動順序來分配事務id的。

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

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

相關文章

Bilibili多語言字幕翻譯擴展:基于上下文的實時翻譯方案設計

Bilibili多語言字幕翻譯擴展&#xff1a;基于上下文的實時翻譯方案設計 本文介紹了一個Chrome擴展的設計與實現&#xff0c;該擴展可以為Bilibili視頻提供實時多語言字幕翻譯功能。重點討論了字幕翻譯中的上下文問題及其解決方案。 該項目已經登陸Chrome Extension Store: http…

熱血三國野地名將列表

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>野地名將信息表</title><style>tabl…

【記錄】Word|Word創建自動編號的多級列表標題樣式

文章目錄 前言創建方式第一種方法&#xff1a;從“定義多級列表”中直接綁定已有樣式第二種方法&#xff1a;通過已有段落創建樣式&#xff0c;再綁定補充說明 尾聲 前言 這世上荒唐的事情不少&#xff0c;但若說到吊詭&#xff0c;Word中的多級列表樣式設定&#xff0c;倒是能…

使用mavros啟動多機SITL仿真

使用mavros啟動多機SITL仿真 方式1&#xff1a;使用roslaunch一鍵啟動Step1&#xff1a;創建一個新的 ROS 包或放到現有包里Step2&#xff1a;編輯 multi_mavros.launchStep3&#xff1a;構建工作空間并 source 環境Step4&#xff1a;構建工作空間并 source 環境 方式2&#xf…

Flutter 網絡棧入門,Dio 與 Retrofit 全面指南

面向多年 iOS 開發者的零阻力上手 寫在前面 你在 iOS 項目中也許習慣了 URLSession、Alamofire 或 Moya。 換到 Flutter 后&#xff0c;等價的「組合拳」就是 Dio Retrofit。 本文將帶你一次吃透兩套庫的安裝、核心 API、進階技巧與最佳實踐。 1. Dio&#xff1a;Flutter 里的…

工作室考核源碼(帶后端)

題目內容可更改 下載地址:https://mcwlkj.lanzoub.com/iUF3z300tgfe 如圖所示

數字孿生技術為UI前端提供全面支持:實現產品的可視化配置與定制

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩! 一、引言&#xff1a;數字孿生驅動產品定制的技術革命 在消費升級與工業 4.0 的雙重驅動下&a…

通往物理世界自主智能的二元實在論與羅塞塔協議

序章&#xff1a;AI的“兩種文化”之爭——我們是否在構建錯誤的“神”&#xff1f; 自誕生以來&#xff0c;人工智能領域始終存在著一場隱秘的“兩種文化”之爭。一方是符號主義與邏輯的信徒&#xff0c;他們追求可解釋、嚴謹的推理&#xff0c;相信智能的核心在于對世界規則…

探索 AI 系統提示與模型資源庫:`system-prompts-and-models-of-ai-tools`

在當今的人工智能領域,系統提示和工具模型的優化與應用對于提升 AI 助手的性能和響應質量至關重要。x1xhlol 開源的 system-prompts-and-models-of-ai-tools 倉庫為開發者們提供了一個豐富的資源集合,涵蓋了多種 AI 工具的系統提示、工具和模型。 倉庫概述 這個倉庫包含了超…

城市燈光夜景人像街拍攝影后期Lr調色教程,手機濾鏡PS+Lightroom預設下載!

調色教程 “城市燈光夜景人像街拍攝影后期 Lr 調色”&#xff0c;主要是利用 Lightroom 軟件&#xff0c;對城市夜景中燈光下的人像街拍照片進行處理。通過調整色彩平衡、明暗對比和細節質感&#xff0c;強化夜景燈光的絢麗感&#xff0c;突出人像主體&#xff0c;同時協調人物…

JavaScript中的call、apply、bind:用法、實現與區別詳解(面試常見)

# JavaScript中的call、apply、bind&#xff1a;用法、實現與區別詳解## 核心概念 這三個方法都用于改變函數執行時的this指向&#xff0c;是JavaScript中函數上下文操作的核心API。## 1. 基本用法對比### call方法 javascript function.call(thisArg, arg1, arg2, ...)特點&am…

使用vue開發瀏覽器chrome插件教程,及之間的消息通信

基本介紹 開發瀏覽器插件&#xff0c;首先需要先了解他的結構&#xff0c;瀏覽器擴展通常包括以下幾個部分 ├── manifest.json ├── package.json ├── vite.config.js ├── src ├── background │ └── index.js ├── content │ └── content.js ├── …

論文筆記(八十八)MLCVNet: Multi-Level Context VoteNet for 3D Object Detection

MLCVNet: Multi-Level Context VoteNet for 3D Object Detection 文章概括摘要I. 引言2. 相關工作2.1. 基于點云的 3D 目標檢測2.2. 上下文信息 3. 方法3.1. VoteNet3.2. PPC 模塊3.3. OOC 模塊3.4. GSC 模塊 4. 結果與討論4.1. 數據集4.2. 訓練細節4.3. 與最先進方法的比較4.4…

Redis初識第四期----Hash的命令和應用場景

首先為了區分Redis的鍵值對存儲的key-value&#xff0c;Hash中的鍵值對稱為field-value。 命令 1.Hset Hset key field value [field value] 返回值為設置成功的field-value的個數。 2.Hget Hget key field 返回為value 3.Hexists Hexists key field 判斷是否存在&a…

【大數據技術棧】數據管理范疇常用大數據技術棧

一、技術棧分層架構 大數據技術棧通常分為四個核心層級&#xff1a; 數據采集層 負責多源異構數據的實時/批量采集 日志采集&#xff1a; F l u m e Flume Flume、 L o g s t a s h Logstash Logstash消息隊列&#xff1a; K a f k a Kafka Kafka、 R a b b i t M Q RabbitMQ …

安全左移(Shift Left Security):軟件安全的演進之路

文章目錄 一、背景&#xff1a;傳統安全的尷尬處境二、安全左移&#xff1a;讓安全成為開發的“第一等公民”三、安全左移的關鍵實施階段1. 需求階段&#xff1a;嵌入安全需求建模2. 設計階段&#xff1a;威脅建模與架構審計3. 編碼階段&#xff1a;安全編碼規范與靜態分析4. 構…

固定債可以賣call嗎

我們都知道如果持有tlt&#xff0c;可以賣call來賺取時間價值&#xff0c;如果我買固定到期的美債而不是etf&#xff0c;有類似的操作嗎&#xff0c;我可以賣call嗎 以下是關于直接持有固定到期美債并嘗試賣出看漲期權的詳細分析&#xff1a; 一、直接持有美債與ETF&#xff08…

fish安裝node.js環境

為什么強調fish shell&#xff0c;因為fish shell的緣故&#xff0c;不能直接執行node.js官網的命令 好的&#xff0c;您遇到了一個非常典型且重要的問題。請仔細閱讀我的分析&#xff0c;這能幫您徹底解決問題。 問題診斷 您看到的所有錯誤&#xff0c;歸根結底有兩個核心原…

記一次Ubuntu22安裝MongoDB8并同步本地數據過程

1. 效果展示 2. 安裝MongoDB 8 根據官方文檔https://www.mongodb.com/zh-cn/docs/manual/tutorial/install-mongodb-on-ubuntu/一頓操作即可 2.1 配置微調支持遠程訪問 修改配置文件,默認/etc/mongod.conf # network interfaces net:port: 27017bindIp: 0.0.0.02.2 新增adm…

HarmonyOS應用開發高級認證知識點梳理 (三)狀態管理V2裝飾器核心規則

以下是針對HarmonyOS應用開發高級認證備考的?狀態管理V2裝飾器核心規則?知識點系統梳理&#xff1a; 一、核心裝飾器分類與功能 1. ?組件聲明裝飾器? ComponentV2? (1)基礎定義與限制 功能定位? 用于裝飾自定義組件&#xff0c;啟用V2狀態管理能力&#xff0c;需配…