面试官:SQL语句Select For Update用到了什么锁?

大神们在线教一下,面试官:SQL语句Select For Update用到了什么锁?
最新回答
画心骨

2026-10-22 09:03:07

前几天的一次分享交流中,同事问了一个关于锁的问题。他提到,如果执行了SQL语句`SELECT...For Update`,锁住了某条数据,并且事务还没提交,那么如果有其他人在同一时间执行同样语句会怎么样?他们讨论的是行锁和表锁的区别。这篇文章将详细解答这个问题。

加的锁究竟是行锁还是表锁,这取决于SQL语句的`WHERE`条件。MySQL中存在多种锁,包括行锁、表锁、间隙锁、临界锁等。在实际业务中,使用行锁通常需要使用`SELECT...For Update`。但是,正确使用是关键,否则可能导致整个表被锁住,影响性能。`WHERE`条件的不同决定了锁的类型。

使用主键参数时,`SELECT...For Update`会加行锁。以订单表为例,修改主键编号为10的记录。如果在事务1中执行了未提交的`SELECT...For Update`,其他事务尝试修改同样主键的记录时会被阻塞。

事务2尝试修改主键编号为10的订单记录时,由于事务1的行锁,它无法获取锁并更新数据。但是,事务2可以成功更新其他主键ID为11的订单记录,不受影响。

使用唯一索引(如订单编码)时,执行`SELECT...For Update`同样会加行锁,阻塞其他尝试修改同样唯一索引值的事务。

使用普通索引时,同样加行锁。在执行`SELECT...For Update`时,根据`WHERE`条件选择的普通索引,锁住的可能是多条记录。

当使用普通字段作为`WHERE`条件时,加的锁取决于数据库的处理方式,可能加行锁,也可能加表锁,导致表锁住。

如果执行的`SELECT...For Update`时,`WHERE`条件匹配的记录不存在,那么不会加锁。

总结来说,使用`SELECT...For Update`时,`WHERE`条件不同,锁的类型和范围也不同。正确使用可以避免锁全表的情况,确保数据库性能。记住,在实际开发中要特别注意这一点,确保更新操作的正确性和效率。