Laravel悲观锁sharedLock与lockForUpdate
Laravel使用悲观锁
重点:sharedLock 和 lockForUpdate 仅适用于InnoDB,并且必须开启事务,在begin与commit之间才生效。
for update
与 lock in share mode
都是用于确保被选中的记录值不能被其它事务更新(上锁)。
两者的区别在于 lock in share mode
不会阻塞其它事务读取被锁定行记录的值。
而 for update
会阻塞其他锁定性读对锁定行的读取
(非锁定性读仍然可以读取这些记录,lock in share mode 和 for update 都是锁定性读)。
举个计数器的例子:
在一条语句中读取一个值,然后在另一条语句中更新这个值。
使用 lock in share mode
的话可以允许两个事务读取相同的初始化值,所以执行两个事务之后最终计数器的值+1;
而如果使用 for update
的话,会锁定第二个事务对记录值的读取直到第一个事务执行完成,这样计数器的最终结果就是+2了。
示例
Laravel 查询构建器提供了一些方法帮助你在 select 语句中实现“悲观锁”。