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中的锁问题,开发者需要对不同的更新语句进行不同的优化,以尽可能减少锁定范围。