Mysql锁:行锁,表锁,共享锁,排他锁,间隙锁…
概念一大把不多赘述
锁粒度越小其资源开销越大,对锁的使用需要在资源与业务上寻找一个平衡点
Laravel行级排他锁
注意:行级锁需要在索引列上使用,否则其升级为表锁(非共享锁在没有使用索引的情况下InnoDB就会使用表级锁)
public function test(){
DB::beginTransaction();
Test::query()->lockForUpdate()->where("id",1)->first();
for($i=0;$i<=100;$i++){
sleep(1);
var_dump($i);
}
}
用sleep来拉长下执行时间,在客户端开第二个进程执行
select * from tests where id = 1 for update;
就会发现其被第一个进行所阻塞。
- 加锁必须在事务中
- 读取时普通读取依然不会被阻塞
- 写入时操作时无论是否使用索引,是否单独批量写入,只要涉及该行数据都将被阻塞