mysql 按順序 自增長 MySQL 鎖

2021-10-13 23:34:10 字數 2388 閱讀 9661

鎖是資料庫系統區別於檔案系統的乙個關鍵特性。鎖機制用於管理對共享資源的併發訪問。

共享鎖與獨佔鎖

意向鎖record lock

間隙鎖下一鍵鎖

自增鎖innodb加鎖

鎖的使用

死鎖一些優化鎖效能的建議

1.1多粒度鎖

mysql 不同的儲存引擎支援不同的鎖機制,所有的儲存引擎都以自己的方式顯現了鎖機制,伺服器層完全不了解儲存引擎中的鎖實現:

預設情況下,表鎖和行鎖都是自動獲得的, 不需要額外的命令。

但是在有的情況下, 使用者需要明確地進行鎖表或者進行事務的控制, 以便確保整個事務的完整性,這樣就需要使用事務控制和鎖定語句來完成。

1.1.1不同粒度鎖的比較

1.1.2innodb 行鎖實現方式——記錄鎖

1.2共享鎖與獨佔鎖

innodb 實現了以下兩種型別的行鎖:

1.3意向鎖

為了允許行鎖和表鎖共存,實現多粒度鎖機制,innodb 還有兩種內部使用的意向鎖(intention locks),這兩種意向鎖都是表鎖:

鎖模式的相容情況:

鎖模式的相容情況

1.4record lock

單個行記錄上的鎖。

1.5間隙鎖

間隙鎖是鎖定索引記錄中的間隙,或鎖定第乙個索引和最後乙個索引之間的間隙。

間隙鎖的唯一目的是防止其他事務插入間隙中,不同事務的衝突間隙鎖可以共存,s間隙鎖和x間隙鎖沒有什麼區別,他們執行相同的功能。

使用唯一索引搜尋唯一的值的語句不需要間隙鎖,如這條sqlselect * from child where id = 100;只會鎖定id這一行,如果id未編入索引或有非唯一索引

如果將事務隔離級別設定為已提交讀可以明確禁用間隙鎖。

1.6下一鍵鎖

下一鍵鎖是索引上的記錄鎖和索引之前的間隙鎖的組合。

對於二級索引

對於主鍵索引或唯一索引

1.7自增鎖

mysql會為自增列設定乙個表級鎖,可配置innodb_autoinc_lock_mode控制併發度

為了提高插入效能,鎖不是在乙個事務完成後才釋放,而是在完成對自增長值插入的sql語句後立即釋放。

innodb在事務執行過程中,使用兩階段封鎖協議

隨時都可以執行鎖定,innodb會根據隔離級別在需要的時候自動加鎖;

鎖只有在執行commit或者rollback的時候才會釋放,並且所有的鎖都是在同一時刻被釋放。

2.1隱式加鎖

2.2顯式加鎖

對於普通 select 語句,innodb 不會加任何鎖;事務可以通過以下語句顯式給記錄集加共享鎖或排他鎖:

2.2.1共享鎖(s)

select ... lock in share mode。 其他 session 仍然可以查詢記錄,並也可以對該記錄加 share mode 的共享鎖。但是如果當前事務需要對該記錄進行更新操作,則很有可能造成死鎖。

2.2.2排他鎖(x)

select ... for update。其他 session 可以查詢該記錄,但是不能對該記錄加共享鎖或排他鎖,而是等待獲得鎖。

3.1x鎖的使用場景

為了讓自己查到的資料確保是最新資料,並且查到後的資料只允許自己來修改的時候,需要用到 for update 子句。

3.2s鎖使用場景

為了確保自己查到的資料沒有被其他的事務正在修改,也就是說確保查到的資料是最新的資料,並且不允許其他人來修改資料。但是自己不一定能夠修改資料,因為有可能其他的事務也對這些資料 使用了 in share mode 的方式上了 s 鎖。

3.3效能影響

select for update 語句,相當於乙個 update 語句。在業務繁忙的情況下,如果事務沒有及時的commit或者rollback 可能會造成其他事務長時間的等待,從而影響資料庫的併發使用效率。

select lock in share mode 語句是乙個給查詢的資料上乙個共享鎖(s 鎖)的功能,它允許其他的事務也對該資料上s鎖,但是不能夠允許對該資料進行修改。如果不及時的commit 或者rollback 也可能會造成大量的事務等待。

4.1死鎖的產生、檢測和恢復

4.2innodb避免死鎖

如果出現死鎖,可以用 show innodb status 命令來確定最後乙個死鎖產生的原因。返回結果中包括死鎖相關事務的詳細資訊,如引發死鎖的 sql 語句,事務已經獲得的鎖,正在等待什麼鎖,以及被回滾的事務等。據此可以分析死鎖產生的原因和改進措施。

mysql 去除列的自增長 mysql自增長列

自增長列必須是索引列,否則無法建立成功表,對myisma和innodb都一樣 localhost testdb root create table test5 id int auto increment,name varchar 10 engine innodb error 1075 42000 l...

mysql 主鍵自增長

mysql 資料庫表主鍵自增長的sql語句 1 不控制主鍵的起點 create table emb t dictbustype emb c bustypeid int not null auto increment,emb c bustypeenname varchar 255 not null,e...

mysql重置自增長屬性

mysql在建表示,被標記為auto increment的屬性,如 create table test id int auto increment,name varchar 10 primary key host id 這樣的屬性在插入的時候只要傳入null,就會獲得自動分配,且依次增長的變數 in...