成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

一文詳解MySql行級鎖和表級鎖

MySql 行級鎖 表級鎖

如何保證數據并發訪問的一致性、有效性是所有數據庫必須解決的一個問題,鎖沖突也是影響數據庫并發訪問性能的一個重要因素。從這個角度來說,鎖對數據庫而言顯得尤其重要,也更加復雜。

MySQL鎖概述

相對其他數據庫而言,MySQL的鎖機制比較簡單,其最顯著的特點是不同的存儲引擎支持不同的鎖機制。
比如

MyISAM和MEMORY存儲引擎采用的是表級鎖(table-level locking)。

InnoDB存儲引擎既支持行級鎖(row-level locking),也支持表級鎖,但默認情況下是采用行級鎖。

MySQL這3種鎖的特性可大致歸納如下

表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖沖突的概率最高,并發度最低。

行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖沖突的概率最低,并發度也最高。

頁面鎖:開銷和加鎖時間界于表鎖和行鎖之間;會出現死鎖;鎖定粒度界于表鎖和行鎖之間,并發度一般。

僅從鎖的角度來說:表級鎖更適合于以查詢為主,只有少量按索引條件更新數據的應用,如Web應用;而行級鎖則更適合于有大量按索引條件并發更新少量不同數據,同時又有并發查詢的應用,如一些在線事務處理(OLTP)系統。下面幾節我們重點介紹MySQL表鎖和 InnoDB行鎖的問題。

MyISAM表鎖

MyISAM存儲引擎只支持表鎖,這也是MySQL開始幾個版本中唯一支持的鎖類型。隨著應用對事務完整性和并發性要求的不斷提高,MySQL才開始開發基于事務的存儲引擎,后來慢慢出現了支持頁鎖的BDB存儲引擎和支持行鎖的InnoDB存儲引擎(實際 InnoDB是單獨的一個公司,現在已經被Oracle公司收購)。但是MyISAM的表鎖依然是使用最為廣泛的鎖類型。本節將詳細介紹MyISAM表鎖的使用。

查詢表級鎖爭用情況

可以通過檢查table_locks_waited和table_locks_immediate狀態變量來分析系統上的表鎖定爭奪:

mysql> show status like 'table%';

| Variable_name | Value |

| Table_locks_immediate | 2979 |

| Table_locks_waited | 0 |

2 rows in set (0.00 sec))

如果Table_locks_waited的值比較高,則說明存在著較嚴重的表級鎖爭用情況。

MySQL表級鎖的鎖模式

MySQL的表級鎖有兩種模式:表共享讀鎖(Table Read Lock)和表獨占寫鎖(Table Write Lock)。

MyISAM表的讀操作,不會阻塞其他用戶對同一表的讀請求,但會阻塞對同一表的寫請求;
MyISAM表的寫操作,則會阻塞其他用戶對同一表的讀和寫操作;
MyISAM表的讀操作與寫操作之間,以及寫操作之間是串行的;
當一個線程獲得對一個表的寫鎖后,只有持有鎖的線程可以對表進行更新操作。其他線程的讀、寫操作都會等待,直到鎖被釋放為止。

獲得表film_text的WRITE鎖定

mysql> lock table film_text write;

Query OK, 0 rows affected (0.00 sec)

當前session對鎖定表的查詢、更新、插入操作都可以執行:

mysql> select film_id,title from film_text where film_id = 1001;

| film_id | title |

| 1001 | Update Test |

1 row in set (0.00 sec)

mysql> insert into film_text (film_id,title) values(1003,'Test');

Query OK, 1 row affected (0.00 sec)

mysql> update film_text set title = 'Test' where film_id = 1001;

Query OK, 1 row affected (0.00 sec)

Rows matched: 1 Changed: 1 Warnings: 0

其他session對鎖定表的查詢被阻塞,需要等待鎖被釋放:

mysql> select film_id,title from film_text where film_id = 1001;

等待

釋放鎖:

mysql> unlock tables;

Query OK, 0 rows affected (0.00 sec)

等待

Session2獲得鎖,查詢返回:

mysql> select film_id,title from film_text where film_id = 1001;

| film_id | title |

| 1001 | Test |

1 row in set (57.59 sec)

如何加表鎖?

MyISAM在執行查詢語句(SELECT)前,會自動給涉及的所有表加讀鎖,在執行更新操作(UPDATE、DELETE、INSERT等)前,會自動給涉及的表加寫鎖,這個過程并不需要用戶干預,因此,用戶一般不需要直接用LOCK TABLE命令給MyISAM表顯式加鎖。在示例中,顯式加鎖基本上都是為了方便而已,并非必須如此。

給MyISAM表顯示加鎖,一般是為了在一定程度模擬事務操作,實現對某一時間點多個表的一致性讀取。例如,有一個訂單表orders,其中記錄有各訂單的總金額total,同時還有一個訂單明細表order_detail,其中記錄有各訂單每一產品的金額小計 subtotal,假設我們需要檢查這兩個表的金額合計是否相符,可能就需要執行如下兩條SQL:

Select sum(total) from orders;

Select sum(subtotal) from order_detail;

這時,如果不先給兩個表加鎖,就可能產生錯誤的結果,因為第一條語句執行過程中,order_detail表可能已經發生了改變。因此,正確的方法應該是:

Lock tables orders read local, order_detail read local;

Select sum(total) from orders;

Select sum(subtotal) from order_detail;

Unlock tables;

要特別說明以下兩點內容。

上面的例子在LOCK TABLES時加了“local”選項,其作用就是在滿足MyISAM表并發插入條件的情況下,允許其他用戶在表尾并發插入記錄,有關MyISAM表的并發插入問題,后面還會進一步介紹。

在用LOCK TABLES給表顯式加表鎖時,必須同時取得所有涉及到表的鎖,并且MySQL不支持鎖升級。也就是說,在執行LOCK TABLES后,只能訪問顯式加鎖的這些表,不能訪問未加鎖的表;同時,如果加的是讀鎖,那么只能執行查詢操作,而不能執行更新操作。其實,在自動加鎖的情況下也基本如此,MyISAM總是一次獲得SQL語句所需要的全部鎖。這也正是MyISAM表不會出現死鎖(Deadlock Free)的原因。

一個session使用LOCK TABLE命令給表film_text加了讀鎖,這個session可以查詢鎖定表中的記錄,但更新或訪問其他表都會提示錯誤;同時,另外一個session可以查詢表中的記錄,但更新就會出現鎖等待。

當使用LOCK TABLES時,不僅需要一次鎖定用到的所有表,而且,同一個表在SQL語句中出現多少次,就要通過與SQL語句中相同的別名鎖定多少次,否則也會出錯!

舉例說明如下。

(1)對actor表獲得讀鎖:

mysql> lock table actor read;

Query OK, 0 rows affected (0.00 sec)

(2)但是通過別名訪問會提示錯誤:

mysql> select a.first_name,a.last_name,b.first_name,b.last_name from actor a,actor b where a.first_name = b.first_name and a.first_name = 'Lisa' and a.last_name = 'Tom' and a.last_name <> b.last_name;

ERROR 1100 (HY000): Table 'a' was not locked with LOCK TABLES

(3)需要對別名分別鎖定:

mysql> lock table actor as a read,actor as b read;

Query OK, 0 rows affected (0.00 sec)

(4)按照別名的查詢可以正確執行:

mysql> select a.first_name,a.last_name,b.first_name,b.last_name from actor a,actor b where a.first_name = b.first_name and a.first_name = 'Lisa' and a.last_name = 'Tom' and a.last_name <> b.last_name;

| first_name | last_name | first_name | last_name |

| Lisa | Tom | LISA | MONROE |

1 row in set (0.00 sec)

并發插入(Concurrent Inserts)

上文提到過MyISAM表的讀和寫是串行的,但這是就總體而言的。在一定條件下,MyISAM表也支持查詢和插入操作的并發進行。

MyISAM存儲引擎有一個系統變量concurrent_insert,專門用以控制其并發插入的行為,其值分別可以為0、1或2。

當concurrent_insert設置為0時,不允許并發插入。

當concurrent_insert設置為1時,如果MyISAM表中沒有空洞(即表的中間沒有被刪除的行),MyISAM允許在一個進程讀表的同時,另一個進程從表尾插入記錄。這也是MySQL的默認設置。

當concurrent_insert設置為2時,無論MyISAM表中有沒有空洞,都允許在表尾并發插入記錄。

可以利用MyISAM存儲引擎的并發插入特性,來解決應用中對同一表查詢和插入的鎖爭用。例如,將concurrent_insert系統變量設為2,總是允許并發插入;同時,通過定期在系統空閑時段執行 OPTIMIZE TABLE語句來整理空間碎片,收回因刪除記錄而產生的中間空洞。有關OPTIMIZE TABLE語句的詳細介紹,可以參見第18章中“兩個簡單實用的優化方法”一節的內容。

MyISAM的鎖調度

前面講過,MyISAM存儲引擎的讀鎖和寫鎖是互斥的,讀寫操作是串行的。那么,一個進程請求某個 MyISAM表的讀鎖,同時另一個進程也請求同一表的寫鎖,MySQL如何處理呢?答案是寫進程先獲得鎖。不僅如此,即使讀請求先到鎖等待隊列,寫請求后到,寫鎖也會插到讀鎖請求之前!這是因為MySQL認為寫請求一般比讀請求要重要。這也正是MyISAM表不太適合于有大量更新操作和查詢操作應用的原因,因為,大量的更新操作會造成查詢操作很難獲得讀鎖,從而可能永遠阻塞。這種情況有時可能會變得非常糟糕!幸好我們可以通過一些設置來調節MyISAM 的調度行為。

通過指定啟動參數low-priority-updates,使MyISAM引擎默認給予讀請求以優先的權利。

通過執行命令SET LOW_PRIORITY_UPDATES=1,使該連接發出的更新請求優先級降低。

通過指定INSERT、UPDATE、DELETE語句的LOW_PRIORITY屬性,降低該語句的優先級。

雖然上面3種方法都是要么更新優先,要么查詢優先的方法,但還是可以用其來解決查詢相對重要的應用(如用戶登錄系統)中,讀鎖等待嚴重的問題。

另外,MySQL也提供了一種折中的辦法來調節讀寫沖突,即給系統參數max_write_lock_count設置一個合適的值,當一個表的讀鎖達到這個值后,MySQL就暫時將寫請求的優先級降低,給讀進程一定獲得鎖的機會。

上面已經討論了寫優先調度機制帶來的問題和解決辦法。這里還要強調一點:一些需要長時間運行的查詢操作,也會使寫進程“餓死”!因此,應用中應盡量避免出現長時間運行的查詢操作,不要總想用一條SELECT語句來解決問題,因為這種看似巧妙的SQL語句,往往比較復雜,執行時間較長,在可能的情況下可以通過使用中間表等措施對SQL語句做一定的“分解”,使每一步查詢都能在較短時間完成,從而減少鎖沖突。如果復雜查詢不可避免,應盡量安排在數據庫空閑時段執行,比如一些定期統計可以安排在夜間執行。

InnoDB鎖

InnoDB與MyISAM的最大不同有兩點:一是支持事務(TRANSACTION);二是采用了行級鎖。行級鎖與表級鎖本來就有許多不同之處,另外,事務的引入也帶來了一些新問題。下面我們先介紹一點背景知識,然后詳細討論InnoDB的鎖問題。

1.事務(Transaction)及其ACID屬性

事務是由一組SQL語句組成的邏輯處理單元,事務具有以下4個屬性,通常簡稱為事務的ACID屬性。

(Atomicity)原子性:事務是一個原子操作單元,其對數據的修改,要么全都執行,要么全都不執行。

(Consistent)一致性:在事務開始和完成時,數據都必須保持一致狀態。這意味著所有相關的數據規則都必須應用于事務的修改,以保持數據的完整性;事務結束時,所有的內部數據結構(如B樹索引或雙向鏈表)也都必須是正確的。

(Isolation)隔離性:數據庫系統提供一定的隔離機制,保證事務在不受外部并發操作影響的“獨立”環境執行。這意味著事務處理過程中的中間狀態對外部是不可見的,反之亦然。

(Durable)持久性:事務完成之后,它對于數據的修改是永久性的,即使出現系統故障也能夠保持。

銀行轉帳就是事務的一個典型例子。

2.并發事務處理帶來的問題

相對于串行處理來說,并發事務處理能大大增加數據庫資源的利用率,提高數據庫系統的事務吞吐量,從而可以支持

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
欧美黑人极品猛少妇色XXXXⅩ| 青草青草久热精品视频国产4| 嫩草欧美曰韩国产大片| 中文字幕无码专区人妻系列| 18禁美女黄网站色大片免费看 | 久久精品国产导航| 免费萌白酱国产一区二区三区| 欧美专区日韩视频人妻| 丝袜一区二区三区在线播放| 亚洲AV无码乱码忘忧草亚洲人| 亚洲最新无码成AV人| AV日日碰狠狠躁久久躁| 丰满老熟妇好大BBBBB| 国产又色又爽又刺激在线播放| 久久久久亚洲精品无码网址色欲| 欧美A片XⅩX黑人性受| 少妇粉嫩小泬喷水视频在线观看| 亚洲AV永久无码精品网站色欲| 在线看AV的网站| 成人A级毛片免费观看AV不卡| 国产男男Gay做受×Xx男| 久久精品女同亚洲女同| 亲孑伦视频一区二区三区视频 | 又黄又爽又无遮挡免费的网站| TPU色母和PA6色母的性能| 国产精品WWW夜色视频| 精品人妻人人做人人爽夜夜爽| 内射到高潮的H小说| 天堂いっしょにしよ在线| 亚洲色成人四虎在线观看| YEEZY380蜜桃粉和白色| 国产日韩欧美亚欧在线| 国产成人无码区免费A∨视频网站| 欢迎来到精灵の森林1到四集 | 污污污污污污网站| 伊人色综合久久天天人守人婷| 啊灬啊灬啊灬快灬高潮了电影片段| 国产乱人伦偷精品视频免| 乱人伦人妻中文字幕无码| 少妇高潮一区二区三区99| 亚洲无人区码一码二码三码的特点| C她下嫩B视频内射国产| 国精产品999一区二区三区有限| 男人靠女人免费视频网站| 无码一区二区波多野结衣播放搜索| 在糖心VLOG唐伯虎女主角是谁| 国产成人精品久久| 蜜国产精品JK白丝AV网站| 无码免费无线观看在线视| 14萝自慰专用网站| 国产乱理伦片在线观看夜| 末成年女AV片一区二区| 无码精品A∨在线观看中文| 7777奇米四色眼影| 国产在线看片无码人精品| 亲孑伦一区二区三区| 亚洲卡5卡6卡7卡2021入口| 成人乱子视频在线播放| 久久精品亚洲成在人线AV麻豆| 少妇太爽丰满一区二区| 中文在线中文资源| 国产午夜鲁丝片AV无码| 人妻在线一区二区| 亚洲一线产区二线产区区别在哪| 国产SUV精品一区二区88L| 国产特级毛片AAAAAAA高清| 欧美人妇做爰XXXⅩ性高| 亚洲女毛多水多21P| 公粗挺进了我的密道在线播放| 美女裸体A级毛片| 日本高清视频网站WWW| 亚洲综合精品第一页| 国产精品无码A∨精品影院APP| 欧美一区二区放荡人妇| 亚洲中文字幕日产无码| 国产乱码一卡二卡3卡4卡网站| 人妻丰满熟妇AV无码区免| 野花免费高清完整在线观看| 国产欧美日韩免费看AⅤ视频| 日本大学SGU大二大三| 中文字幕在线观看亚洲日韩| 精品久久久久久无码国产| 偷拍 亚洲 欧洲 综合| JZZIJZZIJ亚洲成熟少妇| 两个男用舌头到我的蕊花| 亚洲成A人一区二区三区 | 四虎国产精品免费久久| IGAO在线视频成人免费| 乱妇乱女熟妇熟女网站| 亚洲国产AV无码专区亚洲AV| 国产成人亚洲精品无码VR| 日本VA视频免费在线观看| 3D动漫同人精品无码专区| 久久久久精品老熟女国产精品| 亚洲AV人无码激艳猛片| 国产成人亚洲精品无码MP4| 日本熟妇色XXXXX日本老妇| 97一期涩涩97片久久久久久久| 久久香蕉国产线看观看怡红院妓院| 亚洲国产AⅤ精品一区二区30P| 国产农村乱子伦精品视频| 双乳被一左一右的吸着| 成人无码网WWW在线观看| 欧洲精品码一区二区三区免费看| √最新版天堂资源网在线下载| 久久久久AV综合网成人| 亚洲精品乱码久久久久久蜜桃不卡| 国产亚洲精久久久久久无码7| 无码人妻精品一区二区蜜桃AV| 跪下吃他胯下的体育生H| 日韩欧美亚洲综合久久影院D3 | AV永久天堂一区二区三区香港| 麻豆AV一区二区天美传媒| 一二三四在线视频社区8| 久久久久久久久久久精品| 亚洲一卡一卡二新区无人区| 精品欧洲AV无码一区二区| 亚洲AV无码专区国产乱码电影 | 亚洲国产成人五月综合网| 国产亚洲精品美女久久久久| 亚洲AⅤ熟女五十路中出| 国产亚洲欧美精品久久久| 性色a∨精品高清在线观看| 国产日产欧产精品精品AI| 午夜无码A级毛片免费视频| 国产无人区码SUV| 亚洲AV秘 无码一区二区三密桃| 国精品产露脸偷拍视频| 亚洲AV午夜成人片精品网站| 红桃视频成人传媒| 亚洲日本VA一区二区三区| 久久人妻蜜桃一区二区三区| 伊人久久大香线蕉AV一区| 免费国产AV在线观看| A级大胆欧美人体大胆666| 人妻丰满熟妇av无码区HD优| 成年美女黄网站色大片免费看| 久久五月丁香中文字幕| 永久免费看啪啪的网站| 蜜臀AⅤ永久无码一区二区| 97久久国产露脸精品国产| 欧美虐SM另类残忍视频| 波多野无码中文字幕AV专区| 涩爱亚洲色欲AV无码成人专区| 国产精品国产三级国产普通话| 新妺妺窝人体色WWW| 精产国品一二三产区区别是什么| 亚洲一区二区三区无码蜜桃| 蜜臀AV无码一区二区三区 | 人妻夜夜爽一区二区三区| 东北老女人高潮大喊舒服死了| 无码AV无码免费一区二区| 韩国无码AV片在线观看网站| 野花ぶるだいあり~しすWWW| 农村人乱弄一区二区的处罚方式| 啊灬啊灬快点灬用力岳| 色综合天天综合网国产| 国产亚洲精品岁国产微拍精品| 亚洲日韩在线A视频在线观看| 免费看黄A级毛片| 波多野结衣AV在线| 无码一区二区三区中文字幕| 久久AV无码AV高潮AV喷吹| 97精品国产手机| 熟妇人妻精品一区二区视频免费的| 国产又爽又黄又舒服又刺激视频 | 久久久久黑人强伦姧人妻| 99RE热这里只有精品视频| 少妇人妻精品一区二区| 国色天香网WWW在线观看| 中国BGMBGMBGM老妇和青年交| 人人爽天天碰狠狠添| 国产女人被躁到高潮的AV| 一本无码字幕在钱少妇人妻| 人妻少妇乱子伦精品无码专区毛片 | 国产精品乱码久久久久久小说 | 亚洲国产成人久久一区二区三区| 美国ZOOM人与ZOOM| 放荡的闷骚娇妻H| 亚洲乱码国产一区三区| 欧美颜射内射中出口爆在线| 国产精品无码综合区| 泳池里强摁做开腿呻吟漫画视频| 日产精品卡2卡三卡乱码网址| 好爽好湿好硬好大免费视频| 6080YY新视觉影院| 我半夜摸妺妺的奶摸到高潮| 久久久久久精品免费免费999| 波多野结衣高潮AV在线播放| 亚洲AV综合色区无码一二三区| 欧美高清VIDEOS36OP| 国产麻传媒精品国产AV| 中文字幕亚洲综合久久蜜桃| 挽起裙子迈开腿坐下去的图片高清 | 亚洲欧美成人精品香蕉网| 欧美人与动性行为视频| 国产午夜福利精品一区二区三区 | 狠狠色丁香五月综合婷婷 | 激情综合亚洲色婷婷五月APP| H无码动漫在线观看人|