行鎖
innodb行鎖是通過索引上的索引項來實現的,這一點mysql與oracle不同,後者是通過在資料中對相應資料行加鎖來實現的。innodb這種行鎖實現特點意味者:只有通過索引條件檢索資料,innodb才會使用行級鎖,否則,innodb將使用表鎖。
間隙鎖當用範圍條件而不是相等條件檢索資料,並請求共享或排他鎖時,innodb會給符合條件的已有資料的索引項加鎖;對於鍵值在條件範圍內但並不存在的記錄,叫做「間隙(gap)」,innodb也會對這個「間隙」加鎖,這種鎖機制就是所謂的間隙鎖(next-key鎖)。
舉例來說,假如emp表中只有101條記錄,其empid的值分別是1,2,…,100,101,sql:
select * from emp where empid > 100 for update
是乙個範圍條件的檢索,innodb不僅會對符合條件的empid值為101的記錄加鎖,也會對empid大於101(這些記錄並不存在)的「間隙」加鎖。
innodb使用間隙鎖的目的,一方面是為了防止幻讀,以滿足相關隔離級別的要求,對於上面的例子,要是不使用間隙鎖,如果其他事務插入了empid大於100的任何記錄,那麼本事務如果再次執行上述語句,就會發生幻讀;
很顯然,在使用範圍條件檢索並鎖定記錄時,innodb這種加鎖機制會阻塞符合條件範圍內鍵值的併發插入,這往往會造成嚴重的鎖等待。因此,在實際開發中,尤其是併發插入比較多的應用,我們要盡量優化業務邏輯,盡量使用相等條件來訪問更新資料,避免使用範圍條件。
表鎖對於innodb表,在絕大部分情況下都應該使用行級鎖,因為事務和行鎖往往是我們之所以選擇innodb表的理由。但在個別特殊事務中,也可以考慮使用表級鎖。
當然,應用中這兩種事務不能太多,否則,就應該考慮使用myisam表。
在innodb下 ,使用表鎖要注意以下兩點。
【參考文件】
mysql中的鎖(表鎖、行鎖)
mysql行鎖的特性 MySql的表鎖行鎖及間隙鎖
常用命令 手動新增表鎖 lock table 表名稱 read write 表名稱2 read write 檢視表上加過的鎖 show open tables 刪除表鎖 unlock tables 1.表鎖 特點 1.每次操作鎖住整張表,開銷小,加鎖快 2.不會出現死鎖 3.鎖定粒度大,發生鎖衝突的...
mysql行鎖表鎖區別 mysql表鎖和行鎖區別
一 表鎖 特點 偏向myisam儲存引擎,開銷小,加鎖快 無死鎖 鎖定粒度大,發生鎖衝突的概率最高,併發度最低。我們在編輯表,或者執行修改表的事情了語句的時候,一般都會給表加上表鎖,可以避免一些不同步的事情出現,表鎖分為兩種,一種是讀鎖,一種是寫鎖。我們可以手動給表加上這兩種鎖,語句是 lock t...
MySQL的表鎖 行鎖
相對其他資料庫而言,mysql的鎖機制比較簡單,其最顯著的特點是不同的儲存引擎支援不同的鎖機制。mysql表級鎖有兩種模式 表共享讀鎖 table read lock 和表獨佔寫鎖 table write lock 對myisam的讀操作,不會阻塞其他使用者對同一表讀請求,但會阻塞對同一表的寫請求 ...