許多人認為,MySQL中的所有更新語句都會加鎖,以避免并發寫入導致的數據一致性問題。但實際情況并非如此。
MySQL中的鎖分為行鎖和表鎖。行鎖只鎖定被更新的行,不影響其他行的讀寫操作;而表鎖則會鎖定整個表,不管是否更新。因此,不同的更新語句會有不同的鎖定方式。
-- 行鎖 -- UPDATE語句會自動加行鎖 UPDATE table SET col1 = val1 WHERE id = 1; -- 如果不想加行鎖,可以使用SELECT ... FOR UPDATE語句 SELECT * FROM table WHERE id = 1 FOR UPDATE; -- 表鎖 -- ALTER TABLE語句會鎖定整張表 ALTER TABLE table ADD col1 int(11); -- OPTIMIZE TABLE語句也會鎖定整張表 OPTIMIZE TABLE table; -- 如果想避免表鎖,可以使用DDL語句,在事務中執行 CREATE TEMPORARY TABLE tmp_table AS SELECT * FROM table WHERE 1 = 0; INSERT INTO tmp_table SELECT * FROM table WHERE id = 1; DROP TABLE table; RENAME TABLE tmp_table TO table;
因此,如果需要避免MySQL中的鎖問題,開發者需要對不同的更新語句進行不同的優化,以盡可能減少鎖定范圍。
上一篇css文字居中屬性
下一篇mysql所有表字段名稱