MySQL唯一鍵insert時(shí)候的DeadLock異常

create table test_innodb_insert_lock

(id int not null primary key auto_increment,

uk int not null unique key) engine = innodb;

開啟三個(gè)終端執(zhí)行窗口,模擬三個(gè)session

session_1,insert成功
session_2,等待...
session_3,等待

Mysql(當(dāng)前問題是在使用innodb引擎的前提下)的鎖種類很多,而insert時(shí)所涉及到的鎖情況較select、update、delete有所不同,相對更復(fù)雜一些。

mysql中如何保障uk的唯一性?肯定是加鎖。那在哪里加鎖?對誰加鎖?如果要操作的數(shù)據(jù)本身還不存在,那又該如何加鎖?

mysql是索引組織表,基于B+樹(多路有序平衡查找樹)來構(gòu)建主鍵索引和二級索引。唯一索引也是二級索引,但其唯一性,幾乎等同于主鍵索引(所以如果表中沒有主鍵只有唯一鍵,唯一鍵是代替主鍵作用的)。所以mysql加鎖是在索引記錄上加鎖。

因?yàn)閗ey由Session1創(chuàng)建,因而在該key上持有X-lock(排他鎖),而Session2和Session3內(nèi)部獲取到DuplicateKey異常后,會先獲取S-lock(共享鎖,讀取該key),之后再嘗試升級鎖成X-lock,然后如果有機(jī)會的話,執(zhí)行插入。這里的機(jī)會,是指Session1回滾并釋放了X-lock。下圖是Session1執(zhí)行rollback后Session2、Session3的反應(yīng):

session_2,搶占成功insert OK
session_3,搶占失敗,DeadLock

當(dāng)然,如果session1正常commit,session2和session3會報(bào)沖突

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容