MySql中的select … for update 是什么呢?
可以理解为, 执行select 语句前, 在查询的行上加锁。
- 所以我们可以理解为, 加上for update查询出来的数据就是当前最新的数据,因为其他事务线程的更新操作都会被阻塞住。 接下来验证下。
第一步:开启事务。
第二步:id=8的行数据执行select … for update
第三步:就看看事务1对 id != 8 的数据进行更新是否成功。
第四步: 更新id=8的那行数据,因为事务2的for update对id=8的行数据上锁了, 所以更新不了。
第五步:提交事务2, 事务1更新id=8的行数据,更新成功。
接下来我又有个疑惑, 当select … for update 超过一定数据时候, 会不会选择直接全表锁定? 我猜测会。 接下来验证下。
这是全表数据,同时给age字段加上了索引。众所周知,未加索引字段作为where条件update更新时会导致全表锁定。
- 先执行事务2的for update, age=20的全部数据肯定被锁定了, 当事务1对age=18的行数据更新的时候, 也获取不到锁, 说明当select for update 超过一定比例后就会进行全表锁定。