InnoDB存儲(chǔ)引擎是MySQL數(shù)據(jù)庫默認(rèn)的事務(wù)型存儲(chǔ)引擎,也是使用比較多的存儲(chǔ)引擎委刘。InnoDB存儲(chǔ)引擎不緊支持表級(jí)鎖丧没,而且在鎖力度控制上可以細(xì)化到行鹰椒,即支持行級(jí)鎖,從而提高并發(fā)操作的性能呕童。說到行級(jí)鎖漆际,不得不說一下InnoDB存儲(chǔ)引擎中兩種標(biāo)準(zhǔn)的行級(jí)鎖,共享鎖和排他鎖夺饲。
共享鎖與排他鎖
共享鎖:允許數(shù)據(jù)庫事務(wù)讀取一行數(shù)據(jù)奸汇。
排他鎖:允許數(shù)據(jù)庫事務(wù)刪除或變更一行數(shù)據(jù)。
當(dāng)一個(gè)事務(wù)獲取了某行數(shù)據(jù)的共享鎖之后往声,其它事務(wù)也可以及時(shí)獲取該行數(shù)據(jù)的共享鎖擂找,不需要等待之前事務(wù)釋放鎖,多個(gè)事務(wù)可以并行獲取共享鎖烁挟,這時(shí)候稱為鎖兼容婴洼。
當(dāng)一個(gè)事務(wù)獲取了某行數(shù)據(jù)的共享鎖之后骨坑,如果有事務(wù)想獲取該行數(shù)據(jù)的排他鎖撼嗓,則該事務(wù)必須等待之前的事務(wù)釋放掉共享鎖,才能獲取排他鎖欢唾,此時(shí)被稱為鎖不兼容且警。
當(dāng)一個(gè)事務(wù)獲取了某行數(shù)據(jù)的排他鎖之后,如果有事務(wù)想獲取改行數(shù)據(jù)的共享鎖或排他鎖礁遣,則都必須等待之前的事務(wù)釋放掉排他鎖斑芜,才能繼續(xù)獲取鎖
下面用一張表來展示共享鎖與排他鎖之間的兼容性。
查看鎖占用情況
當(dāng)一行數(shù)據(jù)被鎖之后祟霍,或者是發(fā)生鎖等待之后杏头,如何查看鎖的占用情況、占用鎖的事務(wù)情況沸呐、鎖等待情況醇王?可以通過MySQL自帶的三張表來查看,這三張表位于information_schema實(shí)例下崭添,分別是INNODB_LOCKS寓娩、INNODB_LOCK_WAITS和INNODB_TRX。