MySQL數據庫的鎖機制是一個至關重要的話題。在數據庫操作中,為了保證事務的正確性和數據的一致性,必須使用鎖機制。下面是mysql數據庫的所有鎖:
共享鎖(S-lock)
共享鎖(S-lock)也稱為讀鎖,當一個事務獲得了共享鎖之后,其他事務可以獲取相同的鎖,并同時讀取同一行數據,但是不允許有事務對它進行修改。在mysql中使用“SELECT ... FOR SHARE”語句來進行共享鎖。
SELECT * FROM demo_table WHERE id = 1 FOR SHARE;
排它鎖(X-lock)
排它鎖(X-lock)也稱為寫鎖,當一個事務獲得了排它鎖之后,其他事務不能獲取到相同的鎖,也不能讀取或修改相同的行數據。在mysql中使用“SELECT ... FOR UPDATE”語句來進行排它鎖。
SELECT * FROM demo_table WHERE id = 1 FOR UPDATE;
間隙鎖(Gap-lock)
間隙鎖(Gap-lock)是鎖定一段記錄之間的鎖,而不是鎖定某個數據記錄本身。當一個事務獲取了間隙鎖,其他事務不能在這個間隙內插入數據行,但是可以對已經存在的行進行修改。在mysql中使用“SELECT ... FOR SHARE”或“SELECT ... FOR UPDATE”語句來獲取間隙鎖。
SELECT * FROM demo_table WHERE id >1 AND id< 10 FOR UPDATE;
記錄鎖(Row-Lock)
記錄鎖(Row-Lock)是直接鎖定某個數據記錄的鎖。當一個事務獲得了記錄鎖之后,其他事務無法修改或讀取相同的記錄,但是可以對其他的記錄進行讀取和修改。在mysql中使用“SELECT ... FOR SHARE”或“SELECT ... FOR UPDATE”語句來獲取記錄鎖。
SELECT * FROM demo_table WHERE id = 1 FOR UPDATE;
意向鎖(Intent-Lock)
意向鎖(Intent-Lock)是在使用表級鎖(Table-Lock)時,為了避免其他事務對粒度更小的行或表加鎖而存在的鎖。當一個事務獲取了表級鎖時,需要對相應的行或表添加意向鎖,通知其他事務這個鎖已經被占用了。
表級鎖(Table-Lock)
表級鎖(Table-Lock)是鎖定整張表的鎖,當一個事務獲得了表級鎖后,其他事務無法讀取或修改這張表中的任何行數據。在MySQL中,使用“LOCK TABLES”或“UNLOCK TABLES”語句來獲取或釋放表級鎖。
# 獲取表級鎖 LOCK TABLES demo_table WRITE; # 釋放表級鎖 UNLOCK TABLES;