1. 程式人生 > >資料庫篇(五)——資料庫的鎖

資料庫篇(五)——資料庫的鎖

一、資料庫的鎖機制及資料庫中有哪些鎖?

鎖是一種併發控制技術,鎖是用來在多個使用者同時訪問同一個資料的時候保護資料的。

兩種基本的鎖型別

  • 共享鎖(S):多個事務科封鎖一個共享頁,任何事務都不能修改該頁;通常是該頁被讀取完畢,S鎖立即被釋放。
  • 排它鎖(X):僅允許一個事務封鎖該頁,其他事務必須等X鎖釋放後才能對該頁進行訪問。

二、死鎖

產生死鎖的四個必要條件:

  • 互斥條件:一個資源只能被一個程序使用
  • 請求與保持條件:一個程序因請求資源阻塞是,對已獲得的資源保持不放
  • 不可剝奪條件:程序已獲得的資源,在未使用完之前,不能強行剝奪
  • 環路等待條件:若干程序形成一種迴圈等待資源的關係
    只要系統發生了死鎖,這些條件必須滿足,只要一個條件不滿足,就不會發生死鎖。

預防死鎖:

預防死鎖只需要破壞四個必要條件之一即可。

避免死鎖:

銀行家演算法

檢測死鎖:

死鎖定理

解除死鎖:

  • 從死鎖程序處剝奪資源
  • 終止部分或全部程序

三、MySQL鎖的粒度(鎖的級別)

MySQL各儲存引擎使用了三種級別的鎖定機制:行級鎖定、頁級鎖定和表級鎖定。

1、表級鎖:

直接鎖定整張表。鎖定時,其他程序不能對該表進行寫操作。如果是寫鎖,其他程序則讀也不允許。

特點:

  • 開銷小,加鎖快;
  • 不會出現死鎖;
  • 鎖定粒度最大,發生鎖衝突的概率最高,併發度最低。
    MyISAM儲存引擎採用的是表級鎖

有兩種模式:

表共享讀鎖(lock table 表名 read;)和表獨佔寫鎖。去掉鎖的命令(unlock tables)

支援併發插入:支援查詢和插入操作併發進行(在表尾併發插入)

鎖排程機制:

寫鎖優先。一個程序請求某個MyISAM表的讀鎖,同時有一個程序也請求這個表的寫鎖,MySQL是讓寫鎖優先獲得鎖。

2、行級鎖:

僅對指定的記錄進行加鎖,其他程序還可以對同一個表中的其他記錄進行操作。

特點:

  • 開銷大,加鎖慢;
  • 會出現死鎖;
  • 鎖定粒度最小,發生鎖衝突的概率最低,併發度最高
    InnoDB儲存引擎即支援行級鎖,也支援表級鎖,預設情況下是採用行級鎖。

3、頁級鎖

一次鎖定相鄰的一組記錄。

特點:

  • 開銷和加鎖時間介於表鎖與行鎖之間;
  • 會出現死鎖;
  • 鎖粒度介於表鎖與行鎖之間,併發度一般。

總結

最常用的處理多使用者併發訪問的方法是加鎖。當一個使用者鎖住資料庫中的某個物件時,其他使用者就不能再訪問該物件。加鎖隨併發訪問的影響體現在所的粒度上。比如:(表鎖)放在一個表上的鎖限制對整個表的併發訪問;(頁鎖)在資料頁的鎖限制了對整個資料頁的訪問;(行鎖)只限制對該行的併發訪問。

四、資料庫的樂觀鎖和悲觀鎖是什麼?

1、悲觀鎖:

假定會發生併發衝突,遮蔽一切可能違反資料完整性的操作。
以MySQL的鎖表過程為例:

要將select.... for update;放在MySQL事務中,即begincommit中,否則不起作用

表結構為:
這裡寫圖片描述
表中內容如下:
這裡寫圖片描述
開啟兩個視窗,其中一個執行select * from ta for update;
在兩一個視窗中執行update操作:
這裡寫圖片描述
視窗1
這裡寫圖片描述
視窗2
在視窗1中執行commit後,視窗2中的update才執行。

特點:

悲觀鎖可能會造成加鎖的時間很長,併發性不好,特別是長事務,影響系統的整體效能。

悲觀鎖的實現方式:

基於資料庫的鎖機制實現。傳統的關係型資料庫裡用到了這種鎖機制,比如:行鎖、表鎖等,讀鎖、寫鎖等,都是在做操作之前先上鎖

2、樂觀鎖:

假設不會發生併發衝突,只在提交操作時檢查是否違反資料完整性。

特點:

比悲觀鎖加鎖的時間短,大大提升了大併發量下的系統整體效能表現。

樂觀鎖的實現方式:

1)大多是基於資料版本記錄機制實現

需要為每一行資料增加一個版本標識(每一行增加一個欄位version),每次更新資料都要更新對應的版本號+1;
也就是說:提交的資料版本號大於資料庫當前版本號,則予以更新,否則認為是過期資料,不得不重新讀取物件並作出更改。
示例:

假設資料庫中賬戶資訊表中有一個version欄位,當前值為1,而當前賬戶餘額欄位(balance)為$100。有以下操作:
1、操作員A讀出(version=1),並將balance扣除$50($100-$50);
2、在A操作的過程中,操作員B也讀入使用者資訊(version=1),並扣除$20($100-$20);
3、A完成了修改操作,將version+1(2),balance為$50提交,由於提交版本大於資料記錄當前版本,資料被更新,此時version=2,balance=$50;
4、B完成操作哦,也將版本號加1(為2)試圖想資料庫提交資料(balance=$80),但此時比對資料庫記錄版本時發現,提交版本號不大於資料庫記錄版本號,因此,B的提交被駁回。

以上示例中發現,樂觀鎖機制避免了長事務中的資料庫加鎖開銷(A和B的操作中都沒有對資料庫資料加鎖),大大提升了大併發量下的系統整體效能表現。

2)使用時間戳來實現

同樣是在需要樂觀鎖控制的表中增加一個欄位,欄位型別是時間戳(timestamp),和上面的version類似,也是在提交更新時檢查當前資料庫中資料的時間戳和自己更新前取到的時間戳進行對比,若一致,提交成功;否則就是版本衝突。

3、悲觀鎖和樂觀鎖的適用場景

如果併發量不大,可以使用悲觀鎖解決併發問題;
若系統的併發量特別大的話,選擇樂觀鎖;
現在大部分應用都是選擇樂觀鎖。

相關推薦

資料庫——資料庫

一、資料庫的鎖機制及資料庫中有哪些鎖? 鎖是一種併發控制技術,鎖是用來在多個使用者同時訪問同一個資料的時候保護資料的。 兩種基本的鎖型別 共享鎖(S):多個事務科封鎖一個共享頁,任何事務都不能修改該頁;通常是該頁被讀取完畢,S鎖立即被釋放。 排它鎖(

資料庫開發組函式,子查詢

組函式: 單行函式:每一行會得到一個結果 組函式(多行函式):一組得到一個結果,預設情況下所有的資料是一組 常用組函式(統計): SUM():求和 AVG():求平均 MAX():求最大 MIN():求最小 COUNT():統計個數

MySql資料庫查詢——合併查詢

1.合併查詢結果 將兩張表的資料合併在一起 先檢視兩張表的內容:select * from t_book; select * from t_booktype; 將兩張表的id屬性合併,有

VB6基本資料庫應用:資料的查詢與篩選

同系列的第五篇,上一篇在:http://blog.csdn.net/jiluoxingren/article/details/9633139 資料的查詢與篩選 第4篇釋出到現在已經過了4天,很抱歉,學生黨,還是悲催的高三,沒辦法,8月1就開學了。以後更新文章的速度可能會

ArcGIS 空間資料庫學習 要素類基礎知識

X,y 容差 建立要素類時,系統將要求您設定 x,y 容差。在拓撲驗證、緩衝區生成、面疊加等聚類操作以及一些編輯操作中,使用 x,y 容差來設定兩個座標之間的最小距離。用於在這些操作過程中確定所有要素座標(結點和折點)間最小距離的 x,y 容差,會影響要素處理操作。按照定義,x,y 容差還定義了座標在聚類操作

2017 Java開發面試題-資料庫1

1、儲存過程 --建立 CREATE PROCEDURE pro_name(IN inputName inputType, OUT outputName outputType) BEGIN--sql statement...SELECT ** INTO outputName

資料庫——優化查詢

資料庫優化查詢的方法有: 1、使用索引 儘量避免全表掃描,首先應考慮在where及order by,group by涉及的列上建立索引。 2、優化SQL語句 通過explain來檢視SQL語句的執行效果,可以幫助選擇更好的索引和優化查詢語句。例如:

MSSQL/WMI/PowerShell結合SQL Server鏡像狀態變化實時告警

mssql 鏡像 實時告警 本文介紹SQL Server鏡像狀態變化實時告警,利用WMI Monitor實時監控鏡像狀態,在狀態發生變化時捕獲相關信息,通過PowerShell發送微信信息,以達到實時告警的目的。1、創建WMI監控DATABASE_MIRRORING_STATE_CH

回顧2017系列:人工智能給UI/UX設計帶來的影響

如今,我們正處於設計新紀年的轉折點上,用機器人和人工智能方面的專家說法表達即“The end is near(終點近了)”。但這並不意味著世界末日,但未來機器人將毫無疑問地接管一部分目前被人類占領的工作。正如未來學家Thomas Frey在TED Talks演講中所預測,到2030年將會消失20億個工作

運維學python之爬蟲中級數據存儲無數據庫版

就是 erro mage name 打印 反序 lis object Circul 本篇主要介紹,爬取html數據後,將html的正文內容存儲為json或csv格式。 1 json格式存儲 選定要爬取的網站後,我們利用之前學過的內容,如:Beautiful Soup、xpa

Python入門之文件操作和字符編碼

Python 文件操作和字符編碼 1、文件操作 1、文件操作流程: 打開文件,得到文件句柄並賦值給一個變量===> file = open("yesterday",encoding="utf-8") 通過句柄對文件進行操作 關閉文件 ==> file.close() 1.2、打開文件的

DevExpress v18.1新版亮點——WinForms

http 時間 分享 編輯器 doc nag 分享圖片 標題 light 用戶界面套包DevExpress v18.1日前終於正式發布,本站將以連載的形式為大家介紹各版本新增內容。本文將介紹了DevExpress WinForms v18.1 的新功能,快來下載試用新版本!

MySQL入門之高可用架構MHA

數據節點 ability ast 圖片 故障轉移 5.5 架構 日本 丟失 一、MHA原理 1、簡介: MHA(Master High Availability)目前在MySQL高可用方面是一個相對成熟的解決方案,它由日本DeNA公司youshimaton(現就職於

Security+認證考試經驗分享——備考

地鐵 但是 網絡安全 個人 cti 介紹 擔心 安全管理 渠道 一、了解渠道 剛開始我是對安全方面感興趣,然後就在網上搜相關的視頻教程,就搜索到了安全牛課堂這個平臺,剛好看到安全牛課堂在推出security+課程,看到安全牛課堂對security+認證的介紹,也是從那時

Spring MVC使用—— 請求路徑問題

文章目錄 1、訪問路徑與資源名稱 2、絕對路徑 3、相對路徑 3.1 以斜槓開頭的相對路徑 3.2 不以斜槓開頭的相對路徑 1、訪問路徑與資源名稱   通常的URL資源訪問路徑有兩部分構成:訪問路徑與

cas 單點登陸實戰-sso-config

  本篇我們講解cas單點登陸在與shiro整合,在與redis整合遇到的問題 先看完整程式碼吧 package com.madnet.config; import com.google.common.base.CaseFormat; import com.madnet

linux基礎:檔案歸檔與不同系統間的檔案傳輸

檔案歸檔 檔案歸檔,就是把多個檔案變成一個歸檔檔案,即將多個檔案打包起來 tar命令 Unix和類Unix系統上的壓縮打包工具,可以將多個檔案合併為一個檔案,打包後的檔名亦為“tar”。tar檔案格式已經成為POSIX標準,最初是POSIX.1-1988,當前是POSIX.1-2

Java Web 的金倉資料庫操作--資料庫的連線

從今天開始進行金倉資料庫的大作業。首先宣告,金倉資料庫與現在主流的Oracle、MySQL、SQL Server等資料庫相比,還是有差距的,所以,如果不是特別需要使用金倉資料庫去完成一些工作或者特意練習自己修正Bug的能力,而只是作為入門去學習資料庫的知識,還是強烈不推薦金倉資料庫。博主希望讀者在閱

Elam的caffe筆記之配置:Centos6.5配置opencv3.1.0

Elam的caffe筆記之配置篇(五):Centos6.5配置opencv3.1.0 配置要求: 系統:centos6.5 目標:基於CUDA8.0+Opencv3.1+Cudnnv5.1+python3.6介面的caffe框架 1.下載opencv-3.1.0.t

資料庫開發資料庫設計

資料庫設計(資料庫開發前期重要部分) 邏輯模型-->物理模型-->轉換成SQL,建立表等物件 Power Design等軟體都可以繪製ER圖 物理模型可以直接轉換成SQL語句 實體關係: 區域 部門 員工 客