Innodb鎖機制

讀鎖

也叫共享鎖、S鎖,若事務T對數據對象A加上S鎖,則事務T能夠讀A但不能修改A,其餘事務只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S 鎖。這保證了其餘事務能夠讀A,但在T釋放A上的S鎖以前不能對A作任何修改。mysql

寫鎖

又稱排他鎖、X鎖。若事務T對數據對象A加上X鎖,事務T能夠讀A也能夠修改A,其餘事務不能再對A加任何鎖,直到T釋放A上的鎖。這保證了其餘事務在T釋放A上的鎖以前不能再讀取和修改A。程序員

表鎖

表鎖:操做對象是數據表。Mysql大多數鎖策略都支持(常見mysql innodb),是系統開銷最低但併發性最低的一個鎖策略。事務t對整個表加讀鎖,則其餘事務可讀不可寫,若加寫鎖,則其餘事務增刪改都不行。算法

頁鎖

行鎖

操做對象是數據表中的一行。是MVCC技術用的比較多的,但在MYISAM用不了,行級鎖用mysql的儲存引擎實現而不是mysql服務器。但行級鎖對系統開銷較大,處理高併發較好。sql

共享鎖

排他鎖

樂觀鎖

悲觀鎖

意向鎖

在mysql中有表鎖,數據庫

LOCK TABLE my_tabl_name READ; 用讀鎖鎖表,會阻塞其餘事務修改表數據。服務器

LOCK TABLE my_table_name WRITe; 用寫鎖鎖表,會阻塞其餘事務讀和寫。併發

②Innodb引擎又支持行鎖,行鎖分爲高併發

共享鎖,一個事務對一行的共享只讀鎖。對象

排它鎖,一個事務對一行的排他讀寫鎖。事務

③這兩中類型的鎖共存的問題

考慮這個例子:

事務A鎖住了表中的一行,讓這一行只能讀,不能寫。

以後,事務B申請整個表的寫鎖。

若是事務B申請成功,那麼理論上它就能修改表中的任意一行,這與A持有的行鎖是衝突的。

數據庫須要避免這種衝突,就是說要讓B的申請被阻塞,直到A釋放了行鎖。

數據庫要怎麼判斷這個衝突呢?

step1:判斷表是否已被其餘事務用表鎖鎖表

step2:判斷表中的每一行是否已被行鎖鎖住。

注意step2,這樣的判斷方法效率實在不高,由於須要遍歷整個表。

因而就有了意向鎖。

在乎向鎖存在的狀況下,事務A必須先申請表的意向共享鎖,成功後再申請一行的行鎖。

在乎向鎖存在的狀況下,上面的判斷能夠改爲

step1:不變

step2:發現表上有意向共享鎖,說明表中有些行被共享行鎖鎖住了,所以,事務B申請表的寫鎖會被阻塞。

注意:申請意向鎖的動做是數據庫完成的,就是說,事務A申請一行的行鎖的時候,數據庫會自動先開始申請表的意向鎖,不須要咱們程序員使用代碼來申請。

鎖算法

記錄鎖(行鎖)

間隙鎖

next-key鎖(行鎖+間隙鎖)

相關文章
相關標籤/搜索