mysql 中select for update 锁表的范围备注
mysql的锁表范围测试
1.主键明确时,行级锁:
解释:指定主键并且数据存在时,仅锁定指定的行,其它行可以进行操作
实例:指定了锁定id=1的行且数据存在①,在更新1时lock wait超时②,但是更新id不为1的项目时可以直接更新③,释放锁后④,可以任意更新⑤
2.主键不明确时,表级锁:
解释:指定主键不明确或者数据不存在时,整表锁定
指定主键不明确包括使用in、not in、<>等
3.使用非主键限定时,表级锁:
解释:如果where条件中不存在主键限定而采用非主键筛选,全表锁定
所以要实现行级锁来实现高并发场景时,必须明确指定主键,否则整个表锁定,影响其它线程操作。
注意:测试时请开两个窗口测试,并且 for update语句要在 begin后 commit前