mysql 鎖住一行資料 MySQL 鎖

2021-10-18 12:00:52 字數 1785 閱讀 8562

鎖的由來

我們需要最大程度地利用資料庫的併發訪問,還需要確保每個使用者以一致性的方式讀取和修改資料,為解決此問題,有了鎖的機制

innodb 儲存引擎相對比mysql 資料庫的其他儲存引擎在這方面要技高一籌

mysql 常用引擎:innodb、myisam、memory

鎖機制用於管理對共享資源的併發訪問,為了保證資料一致性和完整性,必須要有鎖的介入

mysql innodb 鎖的基本型別

有兩個概念的鎖lock 和latch,這裡著重聊聊lock 鎖

latch 輕量級的鎖,因為其要求鎖定的時間必須非常短,如果持續的時間長,則應用的效能會非常差。在innodb 引擎中,latch 可以分為mutex(互斥)和rwlock(讀寫鎖)。用來保證併發執行緒操作臨界資源的正確性,並且沒有死鎖檢測的機制

lock 的物件是事務,用來鎖定資料庫中的物件,如表、頁、行。lock 是在事務commit 或rollback 後進行釋放

在innodb 儲存引擎中的latch,可以通過命令來進行檢視

show engine innodb mutex;

mysql innodb 鎖的基本型別

兩個行級別的鎖(shared and exclusive locks)和兩個表級別的鎖(intention locks)稱為鎖的基本模式

後面三個 record locks、gap locks、next-key locks,我們把它們叫做鎖的演算法

鎖的粒度

在innodb 裡面既有行級別的鎖,又有表級別的鎖,來看下兩者的區別

表鎖:鎖住一張表

行鎖:鎖住表裡面的一行資料

鎖定粒度,表鎖肯定是大於行鎖。另外,表鎖的加鎖效率要比行鎖效率更高

共享鎖第乙個行級別的鎖shared locks(共享鎖),獲取一行資料的讀鎖以後,可以用來讀取資料,所以它也叫做讀鎖,不要在加上了讀鎖以後去寫資料,容易出現死鎖的情況。

共享鎖是可以重複獲取的,通過以下sql 可以進行驗證

釋放鎖有兩種方式,只要事務結束,鎖就會自動釋放,包括提交事務和結束事務

拍它鎖第二個級別的鎖叫做exclusive locks(排它鎖),用來運算元據又稱寫鎖

排它鎖加鎖的方式

1)自動加排它鎖。在運算元據的時候,包括增刪改,都會預設加上一把排它鎖

2)手工加鎖,用乙個for update 給一行資料加上一把排它鎖

以上是兩個行鎖,接下來是兩個表鎖

意向鎖這把鎖是由資料庫自己維護的,我們在給一行資料加上共享鎖之前,資料庫會自動在這張表上面加一把意向共享鎖;當我們給一行資料加上排他鎖之前,資料庫會自動在這張表上面加乙個意向排他鎖

這兩把鎖存在意義何在?

1)有了表級別的鎖,在innodb 裡面就可以支援更多粒度的鎖

2)加表鎖前可以不必去掃瞄整張表,只需要判斷這張表上面有沒有意向鎖,如果有,就直接返回失敗,沒有的話,就可以加鎖成功

在innodb 裡的表鎖,可以理解成乙個標誌

以上就是mysql 4種基本鎖的模式

鎖的原理

鎖住是什麼?思考過嗎?

是索引,鎖是通過索引來實現的

場景:如果表中沒有索引的時候,鎖住一行資料會導致什麼情況?一張表中可能會沒有索引嗎?

1)如果定義了主鍵(primary key) ,innodb 會選擇主鍵作為聚集索引

2) 如果沒有顯示定義主鍵,innodb 會選擇第乙個不包含有 null 值的唯一索

引作為主鍵索引

3)如果也沒有這樣的唯一索引,則 innodb會選擇內建6位元組長的rowid作為隱藏的聚集索引,它會隨著行記錄的寫入而主鍵遞增

先寫到這裡,後續會繼續此篇內容,為故而知新

mysql 一行資料拆分多行

查詢出被逗號分隔字段需要拆分的最大數量 select max length 逗號分隔的字段 length replace 逗號分隔的字段,1 from 處理表 where 條件 建立一張臨時表用於聯合查詢,方便把處理表單行記錄分隔為多行 create temporary table incre ta...

pandas 增加一行資料

常用的方法 df dataframe columns lib qty1 qty2 for i in range 5 df.loc i randint 1,1 for n in range 3 loc可以對沒有的 index 進行賦值,而 iloc 則不允許,iloc只能對已經存在的位置進行操作。pr...

mysql中將一行轉化為多行資料

之前在網上搜尋了很多關於這個問題的解答方式,基本都是使用substring index和mysql.help topic搭配使用,方法沒錯,但是使用後發現執行時間太長,因此就放棄使用網上推薦的方法。可以使用substring index和union all搭配使用 圖1 圖2 將圖1變為圖2,可以這...