MySQL是一個(gè)開(kāi)源的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),在多用戶并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)時(shí),為了保證數(shù)據(jù)的一致性、準(zhǔn)確性和完整性,需要使用鎖避免資源競(jìng)爭(zhēng)問(wèn)題。MySQL中常見(jiàn)的鎖主要有三種:
共享鎖(Shared Lock)
SELECT * FROM table WHERE id=10 LOCK IN SHARE MODE;
共享鎖又稱為S鎖,在讀取數(shù)據(jù)時(shí)使用共享鎖可以保證多個(gè)線程可以同時(shí)讀取一個(gè)數(shù)據(jù),但是不能修改數(shù)據(jù),直到所有的共享鎖都被釋放為止。在實(shí)際應(yīng)用中,共享鎖可以增加數(shù)據(jù)的讀取效率,避免出現(xiàn)讀取到不一致的數(shù)據(jù)。
排他鎖(Exclusive Lock)
UPDATE table SET column1=1 WHERE id=10;
排他鎖又稱為X鎖,在執(zhí)行修改操作時(shí)會(huì)對(duì)數(shù)據(jù)加上排他鎖,其他線程不能訪問(wèn)該數(shù)據(jù),直到修改操作完成并釋放為止。排他鎖可以保證數(shù)據(jù)的獨(dú)占性,避免多個(gè)線程同時(shí)對(duì)同一數(shù)據(jù)進(jìn)行修改而產(chǎn)生數(shù)據(jù)不一致的問(wèn)題。
行級(jí)鎖(Row Lock)
SELECT * FROM table WHERE id=10 FOR UPDATE;
行級(jí)鎖是MySQL中最細(xì)粒度的鎖,它可以在修改數(shù)據(jù)時(shí)只鎖定需要修改的那一行數(shù)據(jù),避免對(duì)整張表進(jìn)行鎖定而影響其他線程的訪問(wèn)。行級(jí)鎖可以提高并發(fā)性,減少鎖的沖突。