2026-10-24 15:31:36
select...for update是悲观锁的一种实现,其加锁范围取决于查询条件是否使用索引/主键:
操作:通过主键id=1查询并加锁,另一个事务尝试更新id=2的记录。
结果:更新成功(未被阻塞),说明仅锁定了id=1的行。
操作:通过唯一索引age=18查询并加锁,另一个事务尝试更新age=20的记录。
结果:更新成功(未被阻塞),说明仅锁定了age=18的行。
操作:通过无索引字段code='A'查询并加锁,另一个事务尝试更新其他记录。
结果:更新被阻塞,说明锁定了整张表。
通过以上验证和结论,可以明确select...for update的锁行为与索引的强关联性,合理设计查询条件是优化锁粒度的关键。