1. 程式人生 > >MySQL中的鎖

MySQL中的鎖

一般情況下,不必對資料庫顯示加鎖,因為DBMS內部加鎖機制已經幫我們做好了,但是為了研究方便,還是需要人為加鎖。資料庫鎖可以根據用途從不同角度劃分。

1、根據級別劃分:

(1)讀鎖(共享鎖,S鎖)

讀鎖的作用是某個事務對這些資料加了讀鎖以後,其他事務只能對這些資料加讀鎖,也可以讀取這些資料,而不能加寫鎖或進行寫操作。

(2)寫鎖(排他鎖,X鎖)

寫鎖的作用是某個事務對資料加了寫鎖之後,其他事務不能對這些資料加任何鎖。

2、如果要顯示加鎖,還需要新增語句完成

(1)加S鎖

select * from 表名稱 [where...] lock in share mode;

(2)加X鎖

select * from 表名稱[where...] for update;

注意:insert,update,delete操作也會加X鎖。

3、根據範圍劃分

(1)行鎖:鎖住某幾行(大部分InnoDB引擎支援)

(2)表鎖:鎖住整個表(MyISAM引擎支援)

現在我們從預設級別(Repeatable—Read)可以研究

開啟2個客戶端

(1)加S鎖

客戶端1


在客戶端1中給資料加上S鎖

客戶端2

因為資料加了S鎖,所以在客戶端2中可以正常讀取資料,但是不能更新資料,因為加了S鎖不能加X鎖。

(2)加X鎖

客戶端1


在客戶端1中對stuid=1的這列資料加X鎖。

客戶端2


在客戶端2中既不能加S鎖也不能加X鎖。

這條select語句根本沒有試圖加任何鎖,所以不會與X鎖產生衝突。

有兩種情況會出現阻塞:鎖衝突或者“死鎖”。

還有一種現象:

在客戶端1中對stuid=1("郭靖")進行更新,不會發生阻塞,但是如果對stuname='郭靖'進行更新操作,就會發生阻塞。

大膽猜想:因為stuid是主鍵,可以唯一確定一條記錄,又發現這條記錄沒有被鎖住,所以不會阻塞。但是stuname不是主鍵,需要一條條去遍歷student表,找到符合要求的記錄,就有可能會遇到已經加X鎖的“黃蓉”記錄,所以會發生阻塞。

相關推薦

MySQL詳解(行、表、頁、悲觀、樂觀等)

原文地址:http://blog.csdn.net/mysteryhaohao/article/details/51669741 鎖,在現實生活中是為我們想要隱藏於外界所使用的一種工具。在計算機中,是協調多個程序或執行緒併發訪問某一資源的一種機制。在資料庫當中,除了傳統

Mysql相關解讀

        以下是個人對mysql資料庫中鎖相關的一些理解,其中如MVCC、next-key鎖等具體的解釋請搜尋相關資料。資料庫中的鎖並不能用於保證在併發情況下業務資料的安全,還是需要在程式中控制資

【大廠面試05期】說一說你對MySQL的瞭解?

這是我總結的一個表格,是本文中涉及到的鎖(因為篇幅有限就沒有包括自增鎖) | 加鎖範圍 | 名稱 | 用法 | | -------- |

Mysql那些機制之InnoDB

插入記錄 都在 讀一行 利用 分數 .net new 第二版 delet 我們知道mysql在曾經。存儲引擎默認是MyISAM。可是隨著對事務和並發的要求越來越高,便引入了InnoDB引擎。它具有支持事務安全等一系列特性。 InnoDB鎖模式 InnoDB實現了兩種

mysqlInnoDB存儲引擎的行和表

nbsp 大於 依然 自帶 打折 一個 系統 指定 任務 Mysql的InnoDB存儲引擎支持事務,默認是行鎖。因為這個特性,所以數據庫支持高並發,但是如果InnoDB更新數據的時候不是行鎖,而是表鎖的話,那麽其並發性會大打折扣,而且也可能導致你的程序出錯。 而導致行鎖變為

【數據庫系列】MySql的select的表範圍

nbsp 範圍 nod 指定 lock 無數據 才會 rdb sele 由於InnoDB預設的是Row-Level Lock,只有明確指定主鍵的時候MySql才會執行Row lock,否則MySql將會執行Table Lock. 1、明確指定主鍵則是行鎖 2、明確指定主鍵,

數據庫:Mysql“select ... for update”排他分析

nbsp 檢索 語句 mit AI pda 兩種 訪問 upd Mysql InnoDB 排他鎖 用法: select … for update; 例如:select * from goods where id = 1 for update; 排他鎖的申

MySQL的行級,表級,頁級

In 回退 常用 info 部分 title 一個 相關 鍵值 轉載:https://blog.csdn.net/zp522123428/article/details/75413745##s4 在計算機科學中,鎖是在執行多線程時用於強行限制資源訪問的同步機制,即用於在並發

基於innodb_print_all_deadlocks從errorlog解析MySQL日誌

search 屬於 賦值 lock png rim img 顯示 dea 本文是說明如何獲取死鎖日誌記錄的,不是說明如何解決死鎖問題的。 MySQL的死鎖可以通過show engine innodb status;來查看,但是show engine innodb s

mysql的相關知識

不可重復讀 避免 並發 數據讀取 等待 並發控制 客戶端 提交 Language 數據庫鎖:數據庫鎖出現的原因是為了處理並發問題。 並發控制一般采用三種方法,分別是樂觀鎖和悲觀鎖以及時間戳。 樂觀鎖認為一個用戶讀數據的時候,別人不會去寫自己所讀的數據,就是不做任何操作。悲觀

MySQL理解

其他 理解 不能 isam 目的 其他人 沖突 表級鎖 互斥 1、目的:解決客戶端並發訪問你的沖突問題 2、鎖的分類   1、鎖類型     1、讀鎖(共享鎖)       查詢(select):加讀鎖之後,被人不能更改表記錄,但是可以進行查詢。

MySQL的行級、表級、頁級

常用 一點 存儲引擎 rac 鎖定 方法 線程 加鎖 計算機      在計算機科學中,鎖是在執行多線程時用於強行限制資源訪問的同步機制,即用於在並發控制中保證對互斥要求的滿足。   在DBMS中,可以按照鎖的粒度把數據庫鎖分為行級鎖(INNODB引擎)、表級鎖(MYISA

MySQL的事務及讀寫實現並發訪問控制

hang dea 執行c 定時 ack 幫助 持久 表操作 查看 一、並發控制中鎖的概念   鎖是並發控制中最核心的概念之一,在MySQL中的鎖分兩大類,一種是讀鎖,一種是寫鎖,讀鎖也可以稱為共享鎖(shared lock),寫鎖也通常稱為排它鎖(exclusive loc

MySQL(表、行MySQL(表、行

MySQL中的鎖(表鎖、行鎖)       鎖是計算機協調多個程序或純執行緒併發訪問某一資源的機制。在資料庫中,除傳統的計算資源(CPU、RAM、I/O)的爭用以外,資料也是一種供許多使用者共享的資源。如何保證資料併發訪問的一致性、有效性是所在有

【轉】【MySQLMySQL(表、行,共享,排它,間隙

https://blog.csdn.net/soonfly/article/details/70238902 本文參考:  http://mysqlpub.com/thread-5383-1-1.html  http://blog.csdn.net/c466254931/ar

MySQL的行級,表級,頁級

在電腦科學中,鎖是在執行多執行緒時用於強行限制資源訪問的同步機制,即用於在併發控制中保證對互斥要求的滿足。 在DBMS中,可以按照鎖的粒度把資料庫鎖分為行級鎖(INNODB引擎)、表級鎖(MYISAM引擎)和頁級鎖(BDB引擎 )。 行級鎖 行級鎖是Mysql中鎖定粒度最細的一種

使用mysql解決高併發問題

為什麼要加鎖 多核計算機的出現,計算機實現真正平行計算,可以在同一時刻,執行多個任務。在多執行緒程式設計中,因為執行緒執行順序不可控導致的資料錯誤。比如,多執行緒的理想狀態是這樣的但是實際情況是這樣的: 在網路程式設計中,在同一時刻,多個客戶端同時請求同一個資源,如果不做控制,也會帶來資料錯誤。比如

004 --Mysql的問題

死鎖 死鎖是指兩個或多個事務在同一個資源上相互佔用, 並請求鎖定對方佔用的資源, 從而導致惡性迴圈的現象. 當多個事務試圖以不同順序鎖定資源時, 就可能產生死鎖.死鎖發生以後, 只有部分或者完全回滾其中一個事務, 才能打破死鎖.   MySQL 中的事務 在 MySQL 提供的眾多儲存引擎中

MySQL】——MySQL機制

概述 相對其他資料庫來說,MySQL的鎖機制比較簡單,不同的儲存引擎支援不同的鎖機制。 MySQL大致可以分為以下3種鎖 表級鎖:操作物件是資料表。MySQL大多數鎖策略都支援,開銷小,加鎖快。不會出現死鎖。鎖定粒度大,發生鎖衝突的概率最高,併發度最低。

MySQL樂觀、悲觀、共享、排它、行、表的概念

樂觀鎖 樂觀鎖是指在操作資料庫時(更新操作),想法很樂觀,認為此次操作不會導致衝突,所以在操作資料時,不進行任何其他的特殊處理(也就是不加鎖),而在進行更新後,再去判斷是否有衝突。 悲觀鎖 悲觀鎖是指在操作資料庫時(更新操作),想法很悲觀,認為此次操作會出現衝突,所以在