一、首先来说一下什么是共享锁?什么是排他锁?
共享:我可以读
写
加锁
, 别人可以 读
加锁
。
排他:只有我 才 可以 读
写
加锁
, 也就是说,必须要等我提交事务,其他的才可以操作。
二、简单例子实现加锁
锁和事务在使用时需要配合使用,也就是用锁时需要先开启事务,事务提交时,会自动解锁。
DB::beginTransaction(); // 开启事务
$good = \App\Models\Good::sharedLock()->first(); //共享锁 s锁 读锁
// $good = \App\Models\Good::lockForUpdate()->first(); //排他锁 x锁 写锁...
DB::commit();
DB::beginTransaction();
$goodsInfo = Goods::where('goods_id',$gid)->lockForUpdate()->first();
$goodsInfo->seckill_stock-=1;
$goodsInfo->save();
DB::commit();
三、怎样利用锁和事务解决并发问题?
在我们的工作中,常常会出现一些对数量控制有精确要求的需求,比如商品库存量、奖品数量、报名人数限制等等,这些应用场景往往都存在高并发可能,比较容易出现数据量超量问题。以下做一下示例探索:
(1)首先设计一个存量表
CREATE TABLE `product` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`product_name` varchar(255) NOT NULL DEFAULT '',
`count` int(10) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;