MySql型別轉換導致行鎖公升級為表鎖

2021-08-22 07:07:45 字數 1479 閱讀 7917

在mysql的寫語句中,給表列賦值與表型別不符合時,mysql底層的優化器發揮作用,會做乙個強制型別轉化,此時能正常操作,但會導致行鎖公升級為表鎖。示例如下

以student表為例,表字段型別:

表內容如下:

開啟兩個session會話視窗,並把兩個會話視窗中的mysql的自動提交模式改為手動提交

在會話視窗1中執行更新語句,但不提交事務。age列在建表時指定的是int型別,此地更新語句中用字串』100』進行賦值,在mysql的優化器中會自動把字串』100』強制轉化為整形100,然後再執行sql檢索。

>update student set

class=3

where age='100'

然後再會話視窗2中對另外沒關係的資料執行更新操作

>update student set age=28

where name='lzj';

正常情況下,兩條sql語句操作的行資料不同,執行起來會互不影響,但實際會話1中的更新操作阻塞了會話2中的更新操作

會話1中執行了更新操作,但沒有執行事務提交,事務的隔離級別為read committed,所以在會話2中還看不到會話1中更新後的結果。但在回話2中執行對其它行資料更新操作時,出現了阻塞。可見會話1中的sql語句的賦值出現了強轉,導致會話1由行鎖公升級為表鎖,鎖住了整個student表,因而會話2中的sql阻塞。下面對會話1中的更新操作執行事務提交,那麼會話2中的更新操作就會繼續執行了

對會話1中的更新操作執行commit手動提交事務後,會話1釋放掉student的表鎖,會話2中的更新操作可以繼續執行。

最後對會話2中的更新也執行commit事務提交,兩條sql都更新完畢,student表內容如下:

從上述案例觀知,sql語句賦值與表列型別不匹配時,mysql的優化器強制轉化為匹配的型別,導致行鎖公升級為表鎖。所以開發中一定要注意型別的匹配,避免行鎖公升級為表鎖,影響併發效能。

mysql 行鎖公升級到表鎖示例

1.檢視儲存引擎 show engines 2.資料結構 3.根據id 主鍵 更新同一條資料,a事務產生行鎖,b事務執行被阻塞,需要提交a事務後才能執行,如果長時間未提交事務,b事務會導致超時 error 1205 hy000 lock wait timeout exceeded try resta...

mysql 行鎖 訂票 mysql 行鎖

在電子商務裡,經常會出現庫存數量少,購買的人又特別多,大併發情況下如何確保商品數量不會被多次購買.其實很簡單,利用事務 for update就可以解決.我們都知道for update實際上是共享鎖,是可以被讀取的.但是如何在執行時,不被讀取呢.簡單來說 假設現在庫存為1,現在有a和b同時購買 先開啟...

mysql行鎖詳解 詳解MySQL行鎖

鎖是計算機協調多個程序或執行緒併發訪問某一資源的機制。鎖保證資料併發訪問的一致性 有效性 鎖衝突也是影響資料庫併發訪問效能的乙個重要因素。鎖是mysql在伺服器層和儲存引擎層的的併發控制。mysql中從對資料操作的粒度分為表鎖和行鎖。表鎖是指對一整張表加鎖,一般是 ddl 處理時使用 而行鎖則是鎖定...