資料庫鎖問題

2022-08-22 03:30:17 字數 3050 閱讀 5906

為了保證資料的一致性。mysql資料庫存在多種資料引擎,mysql各儲存引擎使用了三種型別(級別)的鎖定機制:表級鎖定,行級鎖定和頁級鎖定。

1.表級鎖(表級鎖一次會將整個表鎖定,所可以很好的避免死鎖問題)

(1)鎖定粒度大,鎖衝突概率高、併發度低;

(2)好處是不會出現死鎖、開銷小、獲取鎖和釋放鎖的速度很快;

(3)使用表級鎖定的主要是myisam,memory,csv等一些非事務性儲存引擎,適用於以查詢為主,少量更新的應用。

1.行級鎖

(1)好處是鎖定物件的顆粒度很小,發生鎖衝突的概率低、併發度高;

(2)缺點是開銷大、加鎖慢,行級鎖容易發生死鎖;

(詳解mysql死鎖問題 

)(3)使用行級鎖定的主要是innodb儲存引擎、及分布式儲存引擎ndbcluster等。適用於對事務完整性要求較高的系統。innodb支援行級鎖(row-level locking)和表級鎖,預設為行級鎖。

2.innodb行級鎖型別

(1)共享鎖:又稱讀鎖,簡單講就是多個事務對同一資料進行共享一把鎖,都能訪問到資料,但是只能讀不能修改

(2)排他鎖:又稱寫鎖,排他鎖就是不能與其他鎖並存,如乙個事務獲取了乙個資料行的排他鎖,其他事務就不能再獲取該行的其他鎖,只有獲取排他鎖的事務可以對資料進行讀取和修改。

(3)意向鎖是innodb自動加的,不需使用者干預。意向鎖不會與行級的共享 / 排他鎖互斥!!!意向鎖之間是互相相容的,意向共享鎖和普通共享鎖之間是相容的。

3.注意事項

(1)排他鎖指的是乙個事務在一行資料加上排他鎖後,其他事務不能再在其上加其他的鎖。但可以直接通過select ...from...查詢資料,因為普通查詢沒有任何鎖機制。

(2)mysql innodb引擎中update,delete,insert語句自動加排他鎖;

4.適用場景

(1)共享鎖適用於:用來確認某行記錄是否存在,並確保沒有人對這個記錄進行update或者delete操作,如果當前事務也需要對該記錄進行更新操作,則很有可能造成死鎖。

(2) 排他鎖適用於:鎖定行記錄後需要進行更新操作的應用;

共享鎖(s):select

*from table_name where ... lock in

share mode

排他鎖(x):

select

*from table_name where ... for

update

//具體實現可看

5.為什麼使用意向鎖?

提高了效率。

1

.事務 a 先獲取了某一行的 排他鎖 ,並未提交:

select

*from users where id =

6for

update;

(1)事務 a 獲取了 users 表上的 意向排他鎖 。

(2)事務 a 獲取了 id 為 6

的資料行上的 排他鎖 。 2

.事務 c 也想獲取 users 表中某一行的 排他鎖 :

select

*from users where id =

5for

update;

(1)事務 c 申請 users 表的 意向排他鎖 。

事務 c 檢測到 事務 a 持有 users 表的 意向排他鎖 。

因為意向鎖之間並不互斥,所以 事務 c 獲取到了 users 表的 意向排他鎖 。

因為id 為

5 的資料行上不存在任何 排他鎖 ,最終 事務 c 成功獲取到了該資料行上的 排他鎖 。

1.頁面鎖

(1)介於行級鎖和表級鎖之間;

(2)會發生死鎖;

(3)bdb採用頁面鎖(page-level locking)或表級鎖,預設為頁面鎖。 

1.innodb儲存引擎什麼時候會鎖住整張表(什麼時候使用行級鎖),什麼時候或只鎖住一行呢(使用行鎖)? 

只有通過索引條件查詢資料,innodb才使用行級鎖,否則,innodb將使用表鎖! 記住:一定要記住為匹配條件欄位加索引。

2.什麼時候使用行級鎖?什麼時候使用表級鎖?

(1)在增刪改查時匹配的條件字段不帶有索引時,innodb使用的是表級鎖,

3.行級鎖鎖的是什麼?行級鎖怎麼實現加鎖?

(1)行級鎖是針對索引加的鎖;

(2) innodb行鎖是通過索引上的索引項加鎖來實現的,這一點mysql與oracle不同,後者是通過在資料中對相應資料行加鎖來實現的。

這也就意味著只有通過索引條件檢索資料時,才使用行級鎖,否則 使用表鎖。

4.mysql讀鎖和寫鎖?

(1)因為只有觸發了讀寫鎖,我們才會談是進行行級鎖定還是進行表級鎖定;

(2)用select 命令時觸發讀鎖,當使用update, delete, insert時觸發寫鎖,並且使用rollbackcommit後解除本次鎖定。

5.什麼時候會釋放鎖?

提交事務commit回滾事務rollback就會釋放鎖。

6.常見的鎖演算法:

recordlock鎖記錄鎖鎖資料,不鎖gap):記錄鎖是鎖住記錄的,鎖住的是索引記錄,而不是我們真正的資料記錄

gap鎖(間隙鎖),不鎖記錄,僅僅記錄前面的gap(鎖間隙的意思是鎖定某乙個範圍)

next keylocks鎖,同時鎖住記錄(資料),並且鎖住記錄前面的gap    

所以其實 next-keylocks=gap鎖+ recordlock鎖

資料庫鎖表問題

當多使用者對資料庫進行併發操作時是容易導致資料不一致的問題。一般解決方法是,盡量從業務邏輯的角度來規避這種問題,避免使用資料庫的鎖表功能,容易引起一些問題,如死鎖,長時間的等待鎖的釋放等。如有些系統,從業務邏輯上分析是無需鎖表的,如客戶關係管理系統,自己的使用者只能自己檢視修改,其它人沒有許可權檢視...

資料庫的鎖問題

事務的併發控制協議 oracle採用類似於多版本兩段鎖的協議 multiversion two phase lock protocol 多版本兩段鎖協議對唯讀事務和更新書屋加以區別,如果是唯讀事務則採用多版本控制協議,如果是更新事務則採用強兩段鎖協議。鎖分共享鎖 shared 和排他鎖 exclus...

資料庫鎖問題排查

oracle awr sql執行等資訊 alert 報錯資訊 trance日誌 1 檢視哪些會話鎖了哪些表 select l.session id,o.owner,o.object name from v locked object l,dba objects o where l.object id...