综合干狼人综合首页,日本а中文在线天堂,中国av一区,日韩va亚洲va欧洲va国产

12
2017/05

數(shù)據(jù)庫 鎖的基本原理

發(fā)布時間:2017-05-12 16:03:41
發(fā)布者:pengyifeng
瀏覽量:
0

共享鎖用于讀取數(shù)據(jù)操作,它是非獨占的,允許其他事務(wù)同時讀取其鎖定的資源,但不允許其他事務(wù)更新它。獨占鎖也叫排他鎖,適用于修改數(shù)據(jù)的場合。它所鎖定的資源,其他事務(wù)不能讀取也不能修改。當一個事務(wù)訪問某種數(shù)據(jù)庫資源時,如果執(zhí)行select語句,必須先獲得共享鎖,如果執(zhí)行insert、update或delete語句,必須獲得獨占鎖,這些鎖用于鎖定被操作的資源。

當?shù)诙€事務(wù)也要訪問相同的資源時,如果執(zhí)行select語句,也必須先獲得共享鎖,如果執(zhí)行insert、update或delete語句,也必須獲得獨占鎖。此時根據(jù)已經(jīng)旋轉(zhuǎn)在資源上的鎖的類型,來決定第二個事務(wù)應(yīng)該等待第一個事務(wù)解除對應(yīng)資源的鎖定,還是可以立刻獲得鎖。

1 共享鎖

1、加鎖的條件:當一個事務(wù)執(zhí)行select語句時,數(shù)據(jù)庫系統(tǒng)會為這個事務(wù)分配一把共享鎖,來鎖定被查詢的數(shù)據(jù)。

2、解鎖的條件:在默認情況下,數(shù)據(jù)被讀取后,數(shù)據(jù)庫系統(tǒng)立即解除共享鎖。例如,當一個事務(wù)查詢“SELECT * FROM accounts”語句時,數(shù)據(jù)庫系統(tǒng)首先鎖定第一行,讀取之后,解除對第一行的鎖定,然后鎖定第二行。這樣,在一個事務(wù)讀操作過程中,允許其他事務(wù)同時更新accounts表中未鎖定的行。

3、與其他鎖的兼容性:如果數(shù)據(jù)資源上放置了共享鎖,還能再放置共享鎖和更新鎖。

4、并發(fā)性能:具有良好的并發(fā)性能,當數(shù)據(jù)被放置共享鎖后,還可以再放置共享鎖或更新鎖。所以并發(fā)性能很好。 

2 獨占鎖

1、加鎖的條件:當一個事務(wù)執(zhí)行insert、update或delete語句時,數(shù)據(jù)庫系統(tǒng)會自動對SQL語句操縱的數(shù)據(jù)資源使用獨占鎖。如果該數(shù)據(jù)資源已經(jīng)有其他鎖(任何鎖)存在時,就無法對其再放置獨占鎖了。

2、解鎖的條件:獨占鎖需要等到事務(wù)結(jié)束才能被解除。

3、兼容性:獨占鎖不能和其他鎖兼容,如果數(shù)據(jù)資源上已經(jīng)加了獨占鎖,就不能再放置其他的鎖了。同樣,如果數(shù)據(jù)資源上已經(jīng)放置了其他鎖,那么也就不能再放置獨占鎖了。

4、并發(fā)性能:不用說了,最差。只允許一個事務(wù)訪問鎖定的數(shù)據(jù),如果其他事務(wù)也需要訪問該數(shù)據(jù),就必須等待,起到前一個事務(wù)結(jié)束,解除了獨占鎖,其他事務(wù)才有機會訪問該數(shù)據(jù)。

3 更新鎖

更新鎖在的初始化階段用來鎖定可能要被修改的資源,這可以避免使用共享鎖造成的死鎖現(xiàn)象。讀取accounts表中id為1的記錄。更新操作需要分兩步:

l 執(zhí)行更新操作。

2 如果在第一步使用共享鎖,再第二步把鎖升級為獨占鎖,就可能出現(xiàn)死鎖現(xiàn)象。例如:兩個事務(wù)都獲取了同一數(shù)據(jù)資源的共享鎖,然后都要把鎖升級為獨占鎖,但需要等待另一個事務(wù)解除共享鎖才能升級為獨占鎖,這就造成了死鎖。

更新鎖有如下特征:

l 加鎖的條件:當一個事務(wù)執(zhí)行update語句時,數(shù)據(jù)庫系統(tǒng)會先為事務(wù)分配一把更新鎖。

2 解鎖的條件:當讀取數(shù)據(jù)完畢,執(zhí)行更新操作時,會把更新鎖升級為獨占鎖。

3 與其他鎖的兼容性:更新鎖與共享鎖是兼容的,也就是說,一個資源可以同時放置更新鎖和共享鎖,但是最多放置一把更新鎖。這樣,當多個事務(wù)更新相同的數(shù)據(jù)時,只有一個事務(wù)能獲得更新鎖,然后再把更新鎖升級為獨占鎖,其他事務(wù)必須等到前一個事務(wù)結(jié)束后,才能獲取得更新鎖,這就避免了死鎖。并發(fā)性能:允許多個事務(wù)同時讀鎖定的資源,但不允許其他事務(wù)修改它。


MySQL行級鎖、表級鎖、頁級鎖介紹

       頁級:引擎 BDB。

表級:引擎 MyISAM , 理解為鎖住整個表,可以同時讀,寫不行

行級:引擎 INNODB , 單獨的一行記錄加鎖

表級,直接鎖定整張表,在你鎖定期間,其它進程無法對該表進行寫操作。如果你是寫鎖,則其它進程則讀也不允許

行級,,僅對指定的記錄進行加鎖,這樣其它進程還是可以對同一個表中的其它記錄進行操作。

頁級,表級鎖速度快,但沖突多,行級沖突少,但速度慢。所以取了折衷的頁級,一次鎖定相鄰的一組記錄.MySQL 5.1支持對MyISAM和MEMORY表進行表級鎖定,對BDB表進行頁級鎖定,對InnoDB表進行行級鎖定。

對WRITE,MySQL使用的表鎖定方法原理如下:

如果在表上沒有鎖,在它上面放一個寫鎖。

否則,把鎖定請求放在寫鎖定隊列中。

對READ,MySQL使用的鎖定方法原理如下:

如果在表上沒有寫鎖定,把一個讀鎖定放在它上面 

否則,把鎖請求放在讀鎖定隊列中。

InnoDB使用行鎖定,BDB使用頁鎖定。對于這兩種存儲引擎,都可能存在死鎖。這是因為,在SQL語句處理期間,InnoDB自動獲得行鎖定和BDB獲得頁鎖定,而不是在事務(wù)啟動時獲得。

1.行級鎖定的優(yōu)點:

· 當在許多線程中訪問不同的行時只存在少量鎖定沖突。

· 回滾時只有少量的更改。

· 可以長時間鎖定單一的行。

2.行級鎖定的缺點:

· 比頁級或表級鎖定占用更多的內(nèi)存。

· 當在表的大部分中使用時,比頁級或表級鎖定速度慢,因為你必須獲取更多的鎖。

· 如果你在大部分數(shù)據(jù)上經(jīng)常進行GROUP BY操作或者必須經(jīng)常掃描整個表,比其它鎖定明顯慢很多。

· 用高級別鎖定,通過支持不同的類型鎖定,你也可以很容易地調(diào)節(jié)應(yīng)用程序,因為其鎖成本小于行級鎖定。

3.在以下情況下,表鎖定優(yōu)先于頁級或行級鎖定:

· 表的大部分語句用于讀取。

· 對嚴格的關(guān)鍵字進行讀取和更新,你可以更新或刪除可以用單一的讀取的關(guān)鍵字來提取的一行:

· UPDATE tbl_name SET column=value WHERE unique_key_col=key_value;

· DELETE FROM tbl_name WHERE unique_key_col=key_value;

· SELECT 結(jié)合并行的INSERT語句,并且只有很少的UPDATE或DELETE語句

· 在整個表上有許多掃描或GROUP BY操作,沒有任何寫操作。

/* ========================= mysql 鎖表類型和解鎖語句 ========================= */

如果想要在一個表上做大量的 INSERT 和 SELECT 操作,但是并行的插入?yún)s不可能時,可以將記錄插入到臨時表中,然后定期將臨時表中的數(shù)據(jù)更新到實際的表里??梢杂靡韵旅顚崿F(xiàn):

mysql> LOCK TABLES real_table WRITE, insert_table WRITE;
mysql> INSERT INTO real_table SELECT * FROM insert_table;
mysql> TRUNCATE TABLE insert_table;
mysql> UNLOCK TABLES;

行級鎖的優(yōu)點有:

在很多線程請求不同記錄時減少沖突鎖。

事務(wù)回滾時減少改變數(shù)據(jù)。

使長時間對單獨的一行記錄加鎖成為可能。

行級鎖的缺點有:

比頁級鎖和表級鎖消耗更多的內(nèi)存。

鎖是計算機協(xié)調(diào)多個進程或線程并發(fā)訪問某一資源的機制,不同的數(shù)據(jù)庫的鎖機制大同小異。由于數(shù)據(jù)庫資源是一種供許多用戶共享的資源,所以如何保證數(shù)據(jù)并發(fā)訪問的一致性、有效性是所有數(shù)據(jù)庫必須解決的一個問題,鎖沖突也是影響數(shù)據(jù)庫并發(fā)訪問性能的一個重要因素。了解鎖機制不僅可以使我們更有效的開發(fā)利用數(shù)據(jù)庫資源,也使我們能夠更好地維護數(shù)據(jù)庫,從而提高數(shù)據(jù)庫的性能。

MySQL的鎖機制比較簡單,其最顯著的特點是不同的存儲引擎支持不同的鎖機制。

例如,MyISAM和MEMORY存儲引擎采用的是表級鎖(table-level-locking);BDB存儲引擎采用的是頁面鎖(page-level-locking),同時也支持表級鎖;InnoDB存儲引擎既支持行級鎖,也支持表級鎖,默認情況下是采用行級鎖。

上述三種鎖的特性可大致歸納如下:

1) 表級鎖:開銷小,加鎖快;不會出現(xiàn)死鎖;鎖定粒度大,發(fā)生鎖沖突的概率最高,并發(fā)度最低。
2) 行級鎖:開銷大,加鎖慢;會出現(xiàn)死鎖;鎖定粒度最小,發(fā)生鎖沖突的概率最低,并發(fā)度也最高。
3) 頁面鎖:開銷和加鎖時間界于表鎖和行鎖之間;會出現(xiàn)死鎖;鎖定粒度界于表鎖和行鎖之間,并發(fā)度一般。

三種鎖各有各的特點,若僅從鎖的角度來說,表級鎖更適合于以查詢?yōu)橹鳎挥猩倭堪此饕龡l件更新數(shù)據(jù)的應(yīng)用,如WEB應(yīng)用;行級鎖更適合于有大量按索引條件并發(fā)更新少量不同數(shù)據(jù),同時又有并發(fā)查詢的應(yīng)用,如一些在線事務(wù)處理(OLTP)系統(tǒng)。

MySQL表級鎖有兩種模式:表共享讀鎖(Table Read Lock)和表獨占寫鎖(Table Write Lock)。什么意思呢,就是說對MyISAM表進行讀操作時,它不會阻塞其他用戶對同一表的讀請求,但會阻塞 對同一表的寫操作;而對MyISAM表的寫操作,則會阻塞其他用戶對同一表的讀和寫操作。

MyISAM表的讀和寫是串行的,即在進行讀操作時不能進行寫操作,反之也是一樣。但在一定條件下MyISAM表也支持查詢和插入的操作的并發(fā)進行,其機制是通過控制一個系統(tǒng)變量(concurrent_insert)來進行的,當其值設(shè)置為0時,不允許并發(fā)插入;當其值設(shè)置為1 時,如果MyISAM表中沒有空洞(即表中沒有被刪除的行),MyISAM允許在一個進程讀表的同時,另一個進程從表尾插入記錄;當其值設(shè)置為2時,無論MyISAM表中有沒有空洞,都允許在表尾并發(fā)插入記錄。

MyISAM鎖調(diào)度是如何實現(xiàn)的呢,這也是一個很關(guān)鍵的問題。例如,當一個進程請求某個MyISAM表的讀鎖,同時另一個進程也請求同一表的寫鎖,此時MySQL將會如優(yōu)先處理進程呢?通過研究表明,寫進程將先獲得鎖(即使讀請求先到鎖等待隊列)。但這也造成一個很大的缺陷,即大量的寫操作會造成查詢操作很難獲得讀鎖,從而可能造成永遠阻塞。所幸我們可以通過一些設(shè)置來調(diào)節(jié)MyISAM的調(diào)度行為。我們可通過指定參數(shù)low-priority-updates,使MyISAM默認引擎給予讀請求以優(yōu)先的權(quán)利,設(shè)置其值為1(set low_priority_updates=1),使優(yōu)先級降低。

InnoDB鎖與MyISAM鎖的最大不同在于:一是支持事務(wù)(TRANCSACTION),二是采用了行級鎖。我們知道事務(wù)是由一組SQL語句組成的邏輯處理單元,其有四個屬性(簡稱ACID屬性),分別為:

原子性(Atomicity):事務(wù)是一個原子操作單元,其對數(shù)據(jù)的修改,要么全部執(zhí)行,要么全都不執(zhí)行;
一致性(Consistent):在事務(wù)開始和完成時,數(shù)據(jù)都必須保持一致狀態(tài);
隔離性(Isolation):數(shù)據(jù)庫系統(tǒng)提供一定的隔離機制,保證事務(wù)在不受外部并發(fā)操作影響的“獨立”環(huán)境執(zhí)行;
持久性(Durable):事務(wù)完成之后,它對于數(shù)據(jù)的修改是永久性的,即使出現(xiàn)系統(tǒng)故障也能夠保持。

InnoDB有兩種模式的行鎖:

1)共享鎖:允許一個事務(wù)去讀一行,阻止其他事務(wù)獲得相同數(shù)據(jù)集的排他鎖。
( Select * from table_name where ......lock in share mode)

2)排他鎖:允許獲得排他鎖的事務(wù)更新數(shù)據(jù),阻止其他事務(wù)取得相同數(shù)據(jù)集的共享讀鎖和 排他寫鎖。(select * from table_name where.....for update)
為了允許行鎖和表鎖共存,實現(xiàn)多粒度鎖機制;同時還有兩種內(nèi)部使用的意向鎖(都是表鎖),分別為意向共享鎖和意向排他鎖。
InnoDB行鎖是通過給索引項加鎖來實現(xiàn)的,即只有通過索引條件檢索數(shù)據(jù),InnoDB才使用行級鎖,否則將使用表鎖!

另外:插入,更新性能優(yōu)化的幾個重要參數(shù)

復制代碼:bulk_insert_buffer_size

批量插入緩存大小, 這個參數(shù)是針對MyISAM存儲引擎來說的.適用于在一次性插入100-1000+條記錄時, 提高效率.默認值是8M.可以針對數(shù)據(jù)量的大小,翻倍增加.

concurrent_insert
并發(fā)插入, 當表沒有空洞(刪除過記錄), 在某進程獲取讀鎖的情況下,其他進程可以在表尾部進行插入.

值可以設(shè)0不允許并發(fā)插入, 1當表沒有空洞時, 執(zhí)行并發(fā)插入, 2不管是否有空洞都執(zhí)行并發(fā)插入.
默認是1 針對表的刪除頻率來設(shè)置.

delay_key_write
針對MyISAM存儲引擎,延遲更新索引.意思是說,update記錄時,先將數(shù)據(jù)up到磁盤,但不up索引,將索引存在內(nèi)存里,當表關(guān)閉時,將內(nèi)存索引,寫到磁盤. 值為 0不開啟, 1開啟. 默認開啟.

delayed_insert_limit, delayed_insert_timeout, delayed_queue_size
延遲插入, 將數(shù)據(jù)先交給內(nèi)存隊列, 然后慢慢地插入.但是這些配置,不是所有的存儲引擎都支持, 目前來看, 常用的InnoDB不支持, MyISAM支持. 根據(jù)實際情況調(diào)大, 一般默認夠用了

/* ==================== MySQL InnoDB 鎖表與鎖行 ======================== */

由于InnoDB預(yù)設(shè)是Row-Level Lock,所以只有「明確」的指定主鍵,MySQL才會執(zhí)行Row lock (只鎖住被選取的資料例) ,否則MySQL將會執(zhí)行Table Lock (將整個資料表單給鎖住)。

注1: FOR UPDATE僅適用于InnoDB,且必須在交易區(qū)塊(BEGIN/COMMIT)中才能生效。

注2: 要測試鎖定的狀況,可以利用MySQL的Command Mode ,開二個視窗來做測試。

在MySql 5.0中測試確實是這樣的另外:MyAsim 只支持表級鎖,InnerDB支持行級鎖

添加了(行級鎖/表級鎖)鎖的數(shù)據(jù)不能被其它事務(wù)再鎖定,也不被其它事務(wù)修改(修改、刪除)
是表級鎖時,不管是否查詢到記錄,都會鎖定表
此外,如果A與B都對表id進行查詢但查詢不到記錄,則A與B在查詢上不會進行row鎖,但A與B都會獲取排它鎖,此時A再插入一條記錄的話則會因為B已經(jīng)有鎖而處于等待中,此時B再插入一條同樣的數(shù)據(jù)則會拋出Deadlock found when trying to get lock; try restarting transaction然后釋放鎖,此時A就獲得了鎖而插入成功


關(guān)鍵詞:
返回列表
综合干狼人综合首页,日本а中文在线天堂,中国av一区,日韩va亚洲va欧洲va国产
av欧美精品.com| 亚洲免费观看在线观看| 成人综合婷婷国产精品久久蜜臀| 欧美精品一区二区三区高清aⅴ| 久久精品免费观看| 亚洲制服丝袜在线| 欧美精品黑人性xxxx| 91视频com| 国产精品一区二区黑丝| 国产精品66部| 在线观看日韩一区| 99精品欧美一区二区蜜桃免费| 青青草原综合久久大伊人精品优势| 国产裸体歌舞团一区二区| 99久久99久久精品国产片果冻| 国产精品区一区二区三区| 日韩一区二区麻豆国产| 欧美日韩亚洲综合在线| 精品免费99久久| 亚洲18色成人| 国产欧美日韩不卡免费| 91福利精品视频| 亚洲午夜激情av| 亚洲午夜一二三区视频| 欧美在线一二三四区| 奇米精品一区二区三区四区| 亚洲一区二区三区视频在线| 久久99精品久久久久久动态图| 中文字幕不卡在线观看| 久久久777精品电影网影网| 日韩影院在线观看| 亚洲综合一区二区| 色婷婷综合久久久| 亚洲精品写真福利| 五月天激情综合| 久久久亚洲综合| 精品视频免费在线| 欧美三级在线看| 国产日韩欧美综合一区| 欧美精品123区| 久久精品在线免费观看| 日韩欧美成人一区二区| 午夜婷婷国产麻豆精品| 丝袜国产日韩另类美女| 久久综合999| 欧美日韩在线亚洲一区蜜芽| 久久久一区二区三区捆绑**| 国产精品一二三四五| 亚洲精品国产无套在线观| 亚洲日本欧美天堂| 91一区在线观看| 在线观看亚洲成人| 亚洲成人1区2区| 国产精品午夜久久| 国产.欧美.日韩| 成人福利在线看| 99久久精品国产精品久久| 亚洲一级在线观看| www.成人在线| 一区二区在线观看视频在线观看| 欧美成人精品二区三区99精品| 欧美一级二级三级乱码| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 国产成人免费在线视频| 欧美大胆人体bbbb| 欧美激情一区二区在线| 亚洲成a人在线观看| 精品少妇一区二区三区视频免付费| 99这里只有久久精品视频| 亚洲成人在线观看视频| 777午夜精品免费视频| 国产精品二三区| 国产高清无密码一区二区三区| 1区2区3区精品视频| 4438x成人网最大色成网站| 精品少妇一区二区| 国产盗摄一区二区| 色综合网色综合| 日韩一区二区在线看片| 久久免费午夜影院| 日韩一级视频免费观看在线| 国产精品一区二区久激情瑜伽| 视频在线观看91| 国产女人18毛片水真多成人如厕| 91精品国产综合久久精品| 久久亚洲二区三区| 日韩欧美色综合网站| 日韩欧美色综合网站| 一区二区久久久久| 久久国产精品99久久久久久老狼| 欧美色综合久久| 精品国精品国产尤物美女| 26uuu亚洲婷婷狠狠天堂| 日本三级韩国三级欧美三级| 一区二区国产视频| 国产精品久久久久影院亚瑟| 99久久久国产精品| 色久优优欧美色久优优| 欧美日韩一区三区四区| 日韩经典一区二区| 麻豆高清免费国产一区| 免费在线观看一区二区三区| 欧美性videosxxxxx| 亚洲免费观看在线观看| 91精品国产福利| 日韩一级片网站| 亚洲一区视频在线| 成人av午夜影院| 国产在线精品不卡| 日本中文字幕不卡| 一区二区高清免费观看影视大全| 轻轻草成人在线| 久久精品国产99久久6| 日韩一区二区三区在线观看| 国产综合久久久久久久久久久久| 亚洲一区二区三区三| 麻豆国产欧美一区二区三区| 国产高清无密码一区二区三区| 成人深夜在线观看| 中文字幕日韩av资源站| 蜜臀91精品一区二区三区| 91在线视频观看| 色哦色哦哦色天天综合| 国产乱码精品一区二区三区五月婷| 成人h动漫精品一区二| 成人国产亚洲欧美成人综合网| www.性欧美| 不卡av在线网| 亚洲黄色免费电影| 极品少妇xxxx精品少妇偷拍| 99v久久综合狠狠综合久久| 天天影视涩香欲综合网| 春色校园综合激情亚洲| 亚洲欧美视频在线观看视频| 亚洲欧美成人一区二区三区| 欧美成人艳星乳罩| 亚洲成av人**亚洲成av**| 99精品久久免费看蜜臀剧情介绍| 麻豆中文一区二区| 久久亚洲免费视频| 国产精品久久久久一区| 一区二区三区在线高清| 天堂一区二区在线免费观看| 972aa.com艺术欧美| 亚洲精品一二三四区| 久久久美女毛片| 亚洲欧洲无码一区二区三区| 国产伦精一区二区三区| 日本大胆欧美人术艺术动态| 一区二区在线观看免费| 爽好多水快深点欧美视频| 91久久久免费一区二区| 丁香啪啪综合成人亚洲小说| 欧美亚洲动漫另类| 色天天综合久久久久综合片| 国产在线麻豆精品观看| 激情另类小说区图片区视频区| 亚洲乱码国产乱码精品精可以看| 粉嫩av一区二区三区粉嫩| 亚洲影院在线观看| 成人午夜视频免费看| 欧美专区亚洲专区| 精品国产亚洲在线| 国产精品自拍av| 在线区一区二视频| 国产精品久久久久三级| 久久综合久久鬼色中文字| 国内成人自拍视频| 日韩高清在线电影| av中文字幕一区| 婷婷国产在线综合| 秋霞国产午夜精品免费视频| 亚洲视频一区在线| 久久久久国产精品厨房| 麻豆精品在线播放| 狠狠色丁香婷综合久久| 欧美刺激脚交jootjob| 日韩三级在线免费观看| 久久精品一区二区三区不卡牛牛| 亚欧色一区w666天堂| 懂色av一区二区三区免费看| 亚洲18影院在线观看| 国产亚洲综合性久久久影院| 国产欧美一区二区在线观看| 亚洲va欧美va天堂v国产综合| 欧美伊人精品成人久久综合97| 在线看国产日韩| 亚洲欧美一区二区在线观看| 成人一区在线看| 国产精品18久久久久久久久久久久| 欧美猛男gaygay网站| 国产精品久久久一本精品| 亚洲主播在线播放| 国产资源精品在线观看| 亚洲亚洲人成综合网络| 国产精品美女久久久久久久久久久| 中文字幕在线视频一区| 国产精品自产自拍| 日韩毛片一二三区| 在线精品观看国产|