悲观锁与乐观锁
Posted zengsf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了悲观锁与乐观锁相关的知识,希望对你有一定的参考价值。
悲观锁:获取数据时对数据行锁定,其他事务要想获取锁,必须等原事务结束。
在mysql中如何添加锁:
查找df_goods_sku中id为12的货物信息,并拿到锁
select * from df_goods_sku where id=12 for update
这里要配置事务一起进行操作
当事务结束时,锁就会释放。
在django中如何加锁呢:
sku = GoodsSKU.objects.select_for_update().get(id=12)
乐观锁:在查询数据的时候不会加锁,但是在更新是会进行判断。
判断更新时库存和之前查出的库存是否一致。
在mysql中如何添加乐观锁:
update df_goods_sku set stock=0, sales=1 where id=17 and stock=1
在django中的写法是
# 返回受影响的行数 res = GoodsSKU.objects.filter(id=sku_id, stock=orgin_stock, update(stock=new_stock, sales=new_sales))
注意: 这是MySQL的默认事务隔离级别,Repeatable Read(可重读)。因此我们需要在mysql中的配置文件,因此 添加上transaction-isolation = READ COMMITTED就可以了。
锁的选择:
1.在冲突比较少的时候使用乐观锁,冲突比较多的时候就是用悲观锁。
2重复操作的代价比较大时也采用悲观锁。
以上是关于悲观锁与乐观锁的主要内容,如果未能解决你的问题,请参考以下文章