《MySQL——鎖》

全局鎖是什么?全局鎖有什么用?全局鎖怎么用?

全局鎖主要用在邏輯備份過程中,對于InnoDB 引擎的庫,使用–single-transaction;
MySQL 提供了一個加全局讀鎖的方法,命令是 Flush tables with read lock (FTWRL),讓整個庫處于只讀狀態。

表鎖是什么?表鎖有什么用?表鎖怎么用?

表鎖一般是在數據庫引擎不支持行鎖的時候才會被用到的.
表鎖的語法是 lock tables … read/write;
加上讀鎖,不會限制別的線程讀,但會限制別的線程寫。加上寫鎖,會限制別的線程讀寫。

行鎖是什么?行鎖有什么用?行鎖怎么用?

行鎖就是針對數據表中行記錄的鎖。
比如事務 A 更新了一行,而這時候事務 B 也要更新同一行,則必須等事務 A 的操作完成后才能進行更新。
在 InnoDB 事務中,行鎖是在需要的時候才加上的,但并不是不需要了就立刻釋放,而是要等到事務結束時才釋放。這個就是兩階段鎖協議。
在這里插入圖片描述
事務 B 的 update 語句會被阻塞,直到事務 A 執行 commit 之后,事務 B 才能繼續執行。
一定知道了事務 A 持有的兩個記錄的行鎖,都是在 commit 的時候才釋放的。若行鎖不是在 commit 之后被釋放,而是在該語句執行完就被釋放,則不會出現事務 B 被鎖住。
如果你的事務中需要鎖多個行,要把最可能造成鎖沖突、最可能影響并發度的鎖盡量往后放。
調整語句順序并不能完全避免死鎖。

死鎖與死鎖檢測

并發系統中不同線程出現循環資源依賴,涉及的線程都在等待別的線程釋放資源時,就會導致這幾個線程都進入無限等待的狀態,稱為死鎖
為了避免這個操作,常用死鎖檢測。
發起死鎖檢測,發現死鎖后,主動回滾死鎖鏈條中的某一個事務,讓其他事務得以繼續執行。將參innodb_deadlock_detect 設置為 on,表示開啟這個邏輯。
死鎖檢測算法復雜度很高 N個進程,遍歷N遍,M個資源,每個資源操作一次。則復雜度 O(M*N^2)。
假設有 1000 個并發線程要同時更新同一行,那么死鎖檢測操作就是 100 萬這個量級的。最終檢測的結果可能是沒有死鎖,但是這期間要消耗大量的 CPU 資源。

何時會死鎖檢測

每條事務執行前都會進行檢測嗎?
并不是,如果他要加鎖訪問的行上有鎖,他才要檢測。
一致性讀不會加鎖,就不需要做死鎖檢測;
并不是每次死鎖檢測都都要掃所有事務。比如某個時刻,事務等待狀態是這樣的:
B在等A,
D在等C,
現在來了一個E,發現E需要等D,那么E就判斷跟D、C是否會形成死鎖,這個檢測不用管B和A。
死鎖檢測其實就是算法,環的檢測,不必每次遍歷一遍當前事務,只需要判斷事務鏈表中,每加入一個新事物后是否有環的生成,有就形成死鎖。這個方法和leetcode的鏈表中的環檢測應該是一個道理。

如何避免高量級的死鎖檢測

為了避免這個問題,一般來說有兩種方法:
1、果你能確保這個業務一定不會出現死鎖,可以臨時把死鎖檢測關掉。一旦發生死鎖現象,則會出現超時(50s)
2、控制并發度:

1、對于相同行的更新,在進入引擎之前排隊。
2、減少行更新鎖沖突的方法:將單行拆成邏輯上的多行

練習

如果你要刪除一個表里面的前 10000 行數據,有以下三種方法可以做到:

第一種,直接執行 delete from T limit 10000;
第二種,在一個連接中循環執行 20 次 delete from T limit 500;
第三種,在 20 個連接中同時執行 delete from T limit 500。

方案一,事務相對較長,則占用鎖的時間較長,會導致其他客戶端等待資源時間較長。
方案二,串行化執行,將相對長的事務分成多次相對短的事務,則每次事務占用鎖的時間相對較短,其他客戶端在等待相應資源的時間也較短。這樣的操作,同時也意味著將資源分片使用(每次執行使用不同片段的資源),可以提高并發性。
方案三,人為自己制造鎖競爭,加劇并發量。

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

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

相關文章

搜索引擎Constellio及Google Search Appliances connectors

做搜索產品的時候發現國外一個同類型的產品contellio,發現功能比較強大,先記錄下來 貌似可以添加文檔 網站 以及數據庫等不同類型的數據源 http://wiki.constellio.com/index.php/Main_Page http://www.constellio.com/ http://www.constellio.com htt…

dig下載_DIG的完整形式是什么?

dig下載DIG:副監察長 (DIG: Deputy Inspector General) DIG is an abbreviation of the Deputy Inspector General. It is a high-level position in the Indian Police Service. The officers who already offered service on Senior Superintendent of Police (SS…

分類器是如何做檢測的?——CascadeClassifier中的detectMultiScale函數解讀

原地址:http://blog.csdn.net/delltdk/article/details/9186875 在進入detectMultiScal函數之前,首先需要對CascadeClassifier做初始化。 1. 初始化——read函數 CascadeClassifier的初始化很簡單: cv::CascadeClassifier classifier; cl…

<MySQL>何時使用普通索引,何時使用唯一索引

如果能夠保證業務代碼不會寫入重復數據,就可以繼續往下看。 如果業務不能保證,那么必須創建唯一索引。 關于查詢能力 普通索引和唯一索引在查詢能力上是沒有很大差別的。 如:select id from T where k5 1、普通索引查找到滿足條件的第一個記…

Web版OutLook,利用POP接收郵件服務器郵件

一直想做一個Web版的OutLook,所以才萌生這個想法,其實以前也接觸過這方面的東西。于是上網找了找,漫天的都是Jmail來接收,好吧,既然大家都在用我也就下載下來試試了。 什么,怎么總是報錯呢?原來…

abs std::abs_ABS的完整形式是什么?

abs std::absABS:防抱死制動系統 (ABS: Anti-lock Braking System) ABS is an abbreviation of the Anti-lock Braking System. It is a safety anti-skid braking system that is used on a variety of aircraft, automobiles and other land vehicles, such as mo…

ubuntu 使用

shell 命令歷史搜索 : ctrl r使能 session 選擇界面:安裝gnome-session-fallback安裝lwqq轉載于:https://www.cnblogs.com/JonnyLulu/p/3600263.html

漢字速查使用方法簡介

《漢字速查》(HanziSearcher)是一個支持全漢字字典和詞典的檢索工具。其界面如下所示。 界面上方為工具欄。 左方為字典和詞典檢索欄。 右方在啟動時顯示版權信息和作者的聯系方式,在執行檢索時,顯示檢索結果。 檢索方法 漢字速查…

android jni示例_Android服務示例

android jni示例A service is a component that runs in the background for supporting different types of operations that are long running. The user is not interacted with these. These perform task even if application is destroyed. Examples include handling of…

《MySQL——選錯索引,該如何做》

如果不斷地刪除歷史數據和新增數據,MySQL有時會選錯索引。 選擇索引是優化器的工作,優化器優化時會考慮的因素:掃描行數、是否需要排序、是否使用臨時表 MySQL通過統計索引上的基數,作為索引的區分度。 統計方法時采樣統計&#x…

LPWSTR 類型的實參與const.char *類型形參不兼容

CString csPlus; CString csSummand; m_PlusNumber.GetWindowTextW(csPlus); m_Summand.GetWindowTextW(csSummand); int nPlus atoi(csPlus.GetBuffer(0)); //將編輯框文本轉換成整數// int nPlus atoi(strcpy(csPlus.GetBuffer(10),"aa")); csPlus.ReleaseBu…

空間換時間,把遞歸的時間復雜度降低到O(2n)

遞歸算法的時間復雜度除非只有前兩項,否則都不是線性的,并且相當耗費內存。我們用最常見的的fibonacci數列來說明: function fibonacci(n){if( n 0 || n 1){return n;} else {return fibonacci(n - 1) fibonacci(n - 2);} } 這是一種最常見…

scala char_Scala中的Char數據類型

scala charScala Char數據類型 (Scala Char Data Type) Character (char) in Scala is a data type that is equivalent to 16-bit unsigned integer. The character data type stores a single character. It can be an alphabet, numbers, symbols, etc. The character takes…

《MySQL——給長字符串加索引》

對于長字符串,可用如下方式建立索引: (1)前綴索引 (2)字符串倒敘前綴索引 (3)添加hash字段并在hash字段上加索引 (4)字段拆分(一個字段可拆分為兩…

[藍橋杯歷屆試題] 歐拉與雞蛋

大數學家歐拉在集市上遇到了本村的兩個農婦,每人跨著個空籃子。她們和歐拉打招呼說兩人剛剛賣完了所有的雞蛋。 歐拉隨便問:“賣了多少雞蛋呢?” 不料一個說:“我們兩人自己賣自己的,一共賣了150個雞蛋,雖然…

Python元組練習

Here, we are covering following Python tuple exercises, 在這里,我們將介紹以下Python元組練習 , Creating & printing a tuple 創建和打印元組 Unpacking the tuple into strings 將元組解包成字符串 Create a tuple containing the letters of…

傻瓜教你看清MVC內部執行流程之ViewData數據傳輸,輕松學MVC--①目了然篇(待續)

1.首先在執行到Controller里面的action(方法)時,執行到最后會調用一個View()-->此方法是Controller的一個方法 源代碼: View Code protected internal ViewResult View(){return View(null /* viewName */, null /* masterName */, null /* model */);} 2.然后繼續調用自己…

《MySQL——count()邏輯》

count()用法 count()語義:該函數為一個聚合函數,對于返回的結果集一行行地判斷,如果count函數地參數不是NULL,累計值就加1,否則不加。最后返回累計值。 所以count(*),count(主鍵id)和count(1)都表示返回滿足條件地結果…

phpmailer 發送郵件

<?php /* 可用新浪和網易郵箱測試成功&#xff0c;但QQ不成功&#xff01; 下載 phpmailer 解壓 http://phpmailer.worxware.com/要注意郵件服務器的端口號&#xff0c;默認是 25 不用修改&#xff0c;如果不是則要修改如下&#xff0c;在$mail->IsSMTP() ;下一行加上 $…

靜態負載均衡和動態負載均衡_動態負載平衡

靜態負載均衡和動態負載均衡動態負載平衡 (Dynamic Load Balancing) The algorithm monitors changes on the system workload and redistributes the work accordingly. 該算法監視系統工作負載的變化并相應地重新分配工作。 This algorithm works on three strategies: 該算…