乐观锁与悲观锁
概念
- 悲观锁(数据库锁)
悲观锁(Pessimistic Lock),顾名思义,很悲观,每次在拿数据时都认为数据有可能被别人修改了,所以每次拿数据时都会上锁,这样别人想拿到这个数据就会block直到锁被释放。悲观锁的实现往往是通过数据库锁的机制实现的,也就是说其他框架实现的悲观锁都是最终转化了数据库的悲观锁模式。
简单来说:当一个人(事务)进了一个房间(锁定数据),只有他出来了(当前锁提交事务),其他人(事务)进去这个房间并做些事(得到锁,并执行操作)。
悲观锁的实现
//0.开始事务
begin;/begin work;/start transaction; (三者选一就可以)
//1.查询出商品信息
select status from t_goods where id=1 for update;
//2.根据商品信息生成订单
insert into t_orders (id,goods_id) values (null,1);
//3.修改商品status为2
update t_goods set status=2;
//4.提交事务
commit;/commit work;
- 乐观锁
乐观锁(Optimistic Lock),每次在拿数据时都认为数据没有被修改过,不会上锁,就真的很乐观,但在更新的时候会先判断一下这段时间内数据有没有被更新过,可以通过版本号判断数据是否被更新过。
乐观锁的实现
//1.查询出商品信息
select (status,status,version) from t_goods where id=#{id}
//2.根据商品信息生成订单
//3.修改商品status为2
update t_goods
set status=2,version=version+1
where id=#{id} and version=#{version};
总结:读频繁-乐观锁,写频繁-悲观锁
网友评论